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
それをsudo
(grep
間接的にコマンドではなくコマンドではなく)それ自体に適用します。
サポートされていないその他sudo
:パイプ、リスト(;
またはで区切られた複数のコマンド)、コマンド&
グループ(または( )
含む{ }
)、条件と算術式([[ ]]
および(( ))
)、論理演算子(!
、&&
および||
)、キーワード(if
、、for
など)、またはシェルエイリアスと関数。while
case
time
これはシェルキーワードなので興味深い例です。そして通常のコマンド(通常/usr/bin/time)を使用するとシェルキーワードとしてsudo time somecommand
認識されないため、通常のコマンド実行バージョンを使用します。time
シェル(キーワード)バージョンを使用するには、以下のシェルを実行して次sudo
のキーワードを認識させることができます。
sudo bash -c 'time echo hello'
フルシェルを実行するので、この形式で必要な他の複雑なシェル構文を使用することもできます。ただし、引用などにご注意ください。以下は、sudo bash -c
シェルの解析(および引用とエスケープの解釈)を介して実行されます。二重そのため、予期しない結果が出やすくなります。