$ 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
厳密に言えば、$myvar
like (文字通り) 値の場合、$(seq 10)
シェルがそのコマンド置換を拡張するとワードセパレータが発生します。bash
root