実現したいこと
sudo経由で実行する必要のあるスクリプトに、パラメータの一つとして ""(空文字列)を渡す必要のあることがあるものがあります。
これを意図通り実行するのが目的です。
前提
Linux(CentOS 7) / bash
発生している問題・エラーメッセージ
このスクリーンショットの通り、空文字列パラメータがコマンドラインから消えてしまいます。
試したこと
"''"
などとして渡してみると、こちらは律儀に''
という長さ2の文字列になって渡るのでした。
`sudo -i ls a b ...` では駄目ですが、 `sudo ls a b ...` と`-i`を除くと想定通り動くようになりますが、これでは要件を満たしませんか?
あ! ほんとですね
しかし、.bash_profile とか読んでくれなかったら、スクリプトとしては役に立たないです⋯
なるほど。
いきあたりばったりですみませんが、これならいかがでしょうか?
```
sudo -i bash -c "ls a b '' c d"
```
manコマンド読んでたら原因はわかってきました。
-i コマンドの場合は sh -c 経由で実行なんですね。一本の文字列にするときに、要エスケープ文字をエスケープするのはちゃんとやっているものの、空文字列という「エスケープするのでなくて単に引用符で囲う」必要あるやつだけ手当て忘れてるんですね、これは。
ご提案のbash -c方式でうまく行きました。
任意のコマンドを流せるように汎用化すると、こうですかね
```
sudo -i bash -c "$(printf "%q " ls a b '' c 'd e')"
```
解決したら、それをご自分で回答として投稿し、当質問を解決済みにしておいてくださいね。
bash -c じゃなくて eval でもいいように思います。
printf "%q" がないとどういうケースで駄目なのでしょうか?

回答1件
あなたの回答
tips
プレビュー