単語の分離を防ぐために、文字列内で変数拡張を引用する方法は?

単語の分離を防ぐために、文字列内で変数拡張を引用する方法は?
$ myvar="/path to/my directory"
$ sudo bash -c "cd $myvar"

この場合、$myvar値の空白によるトークン化を防ぐには、どのように引用する必要がありますかmyvar

ベストアンサー1

いいえ噴射(引用符なしで拡張時に変数を分割する機能に似ています)このコードではasは引用され$myvarません。

しかし$myvar、。bashしたがって、その内容はbashコードとして解釈されます!

そこにある空白のため、複数の引数がに渡される可能性がありますcd噴射これは、シェル構文から複数のトークンに解析されるためです。値があればbye;reboot再起動が発生します!

希望する場所は次のとおりです。

sudo bash -c 'cd -P -- "$1"' bash "$myvar"

$myvar(このインラインスクリプトに最初の引数として渡すこと。IFSトークン化(およびワイルドカード)を防ぐために、そのシェルとがどのように引用されているかを参照$myvarしてください。)$1

または:

sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'

$myvar(環境変数に渡すこと)。

もちろん、以下を実行しても便利なことはありません。ただ cdインラインスクリプトで(入るrootことが可能であることを確認することに加えて)、おそらくあなたはそのスクリプトをそこに置き、次のような他のことをしcdたいでしょう:cd

sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"

アクセスできないディレクトリsudoにアクセスすることが目的であれば、実際には機能しません。cd

sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"

bash現在のディレクトリとのやり取りを開始します$myvar。しかし、シェルはroot

次のことができます。

sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"

bash現在のディレクトリと非特権で対話しようとしている場合、最初にそのディレクトリ$myvarに入る権限がない限り、そのディレクトリが現在の作業ディレクトリであっても、そのディレクトリで何もできません。cd

$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied

例外は次のとおりです。探すディレクトリ自体にアクセスできますが、そのパスのディレクトリコンポーネントの1つにはアクセスできません。

$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied

厳密に言えば、$myvarlike (文字通り) 値の場合、$(seq 10)シェルがそのコマンド置換を拡張するとワードセパレータが発生します。bashroot

おすすめ記事