2016-08-25 14 views
2

sudo bash -cを使用してシェルコマンドを実行しているときに変数拡張を制御したいと思います。Bash - サブシェル文字列にリテラルを強制するには?

私は、通常のシェルからそれを行うことができます知っている:

bash$ export FOO=foo 
bash$ export BAR=bar 
bash$ echo "expand $FOO but not "'$BAR'"" 
expand foo but not $BAR 

にはどうすれsudo bash -cを用いて上記行うことができますか?

$> bash -c "echo \"expand $FOO but not \"'\$BAR'" 
expand foo but not $BAR 

私はエスケープを避けるために、ここで-docの使用をお勧めしかし:

# original echo replaced with printf 
$> printf 'expand %s but not %s\n' "$FOO" '$BAR' 
expand foo but not $BAR 

# prints in here-doc with bash 
$> bash<<-'EOF' 
printf 'expand %s but not %s\n' "$FOO" '$BAR' 
EOF 
expand foo but not $BAR 

答えて

3

bashに渡す文字列を生成しようとするのではなく、ここ-docに関する

$ bash -c 'echo "expand $1 but not $2"' _ "$FOO" '$BAR' 
expand 5 but not $BAR 

_-cで指定されたスクリプトで$0を設定するだけのダミーの値である。)

+1

、ルートENVで動作するようにsudo -Eを使用しています。 http://stackoverflow.com/questions/8633461/how-to-keep-environment-variables-when-using-sudo – shj

0

パス引数あなたが拡大したくない$をエスケープしてこれを使用することができます

bash$ sudo bash -c "echo "expand $FOO but not "'$BAR'""" 
expand 
bash$ sudo bash -c 'echo "expand $FOO but not "'$BAR'""' 
expand but not bar 
関連する問題