sudoは単純なコマンドでのみ機能しますか?

sudoは単純なコマンドでのみ機能しますか?

sudo 単純なコマンドにのみ適用されますか?以下の例を見るとそうです。私の言葉は正しいですか?

$  if true; then echo hello; fi
hello

$ sudo if true; then echo hello; fi
bash: syntax error near unexpected token `then'

$ sudo ( if true; then echo hello; fi )
bash: syntax error near unexpected token `if'

$ sudo "if true; then echo hello; fi"
[sudo] password for t: 
sudo: if true; then echo hello; fi: command not found

$ sudo " ( if true; then echo hello; fi ) "
sudo:  ( if true; then echo hello; fi ) : command not found

しかし、この例を見るとよくわかりません。

$ sudo time echo hello
hello
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 1924maxresident)k
0inputs+0outputs (0major+71minor)pagefaults 0swaps

time echo hello 簡単なコマンドですか?timeコマンド名ではなくキーワードなので、そうは思いません。

ありがとうございます。

ベストアンサー1

sudo完全な「簡単なコマンド」構文もサポートされていません。 BashのマニュアルページのShell Grammarセクションによると:

簡単なコマンド一連のオプション変数の割り当てで、その後にスペース- 単語を分割して次にリダイレクトします。制御演算子

つまり、単純なコマンドは次のようになります。

LC_ALL=C grep -i "keyword" <infile >outfile &

sudo変数の割り当て(例LC_ALL=C:)、コマンド名、および対応するパラメータ(例grep -i "keyword":)はサポートされていますが、確かにリダイレクト(たとえば<infile >outfile)または制御演算子(&)をサポートします。実際、sudo次のようにサポートされていない要素を使用しようとすると:

sudo LC_ALL=C grep -i "keyword" <infile >outfile &

...その後、シェルは&リダイレクトとbackground()を実行する前にそれを解釈し、sudoそれをsudogrep間接的にコマンドではなくコマンドではなく)それ自体に適用します。

サポートされていないその他sudo:パイプ、リスト(;またはで区切られた複数のコマンド)、コマンド&グループ(または( )含む{ })、条件と算術式([[ ]]および(( )))、論理演算子(!&&および||)、キーワード(if、、forなど)、またはシェルエイリアスと関数。whilecase

timeこれはシェルキーワードなので興味深い例です。そして通常のコマンド(通常/usr/bin/time)を使用するとシェルキーワードとしてsudo time somecommand認識されないため、通常のコマンド実行バージョンを使用します。time

シェル(キーワード)バージョンを使用するには、以下のシェルを実行して次sudoのキーワードを認識させることができます。

sudo bash -c 'time echo hello'

フルシェルを実行するので、この形式で必要な他の複雑なシェル構文を使用することもできます。ただし、引用などにご注意ください。以下は、sudo bash -cシェルの解析(および引用とエスケープの解釈)を介して実行されます。二重そのため、予期しない結果が出やすくなります。

おすすめ記事