のようなコマンドを実行すると、cd
実行が「中断」するコマンドがあります。ll
sudo
sudo
前に命令があるとき、どの命令がこのように「中断」されるかを知る経験的法則は何ですか?
このデータは、私と他の初心者がより信頼性の高いスクリプトを書くのに役立ちます。
答え1
ただ外部コマンド経由で実行できますsudo
。
Sudo
sudo
このプログラムは、スーパーユーザー(またはこのオプションを使用している場合は他のユーザー)の有効な権限で外部コマンドを実行するために新しいプロセスをフォーク(開始)します。-u
つまり、シェル内のコマンドは指定できません。これには、シェルキーワード、組み込みコマンド、エイリアス、関数が含まれます。
コマンドを外部コマンド(シェル内部コマンドではなく)として使用できることを確認する最善の方法は、を実行することです。type -a command_name
これにより、指定された実行可能ファイルを含むすべての場所が表示されます。
例 1: シェル内蔵
この場合、cd
コマンドはシェル組み込みとしてのみ使用できます。
$ type -a cd
cd is a shell builtin
以下を使って実行しようとするとsudo
:
$ sudo cd /
sudo: cd: command not found
例 2: エイリアス
この場合、ls
コマンドは外部コマンドですが、同じ名前のエイリアスもユーザーシェルに生成されます。
$ type -a ls
ls is aliased to `ls -F --color'
ls is /bin/ls
を実行するには、sudo ls
スーパーユーザーとして実行されるエイリアスではありません。その-F
オプションが必要な場合は、明示的にオプションとして含める必要がありますsudo ls -F
。
例 3: シェル組み込みコマンドと外部コマンド
この場合、pwd
コマンドはシェルの組み込みおよび外部コマンドとして使用できます。
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
この場合、外部/bin/pwd
コマンドが実行されますsudo
。
$ sudo pwd
/home/anthony
通常、シェル組み込みおよび外部コマンドで提供されるコマンドの他の例には kill
、test
([
)、およびがありますecho
。
sudoを使用した内部シェルコマンドの実行
スーパーユーザー権限で組み込みシェルを実行するには、外部コマンドでシェルを起動する必要があります。たとえば、次のコマンドはbash
スーパーユーザーとして実行され、cd
コマンドラインオプションで提供された組み込みコマンドを使用します。
$ sudo bash -c "cd /; ls"
bin etc lib media mnt ntp.peers proc sbin share sys
tmp var boot dev home lost+found misc net opt … …
注:エイリアスは、-c
そのオプションを指定してBashにコマンドとして渡すことはできません。
シェルリダイレクト
注目すべきもう1つの問題は、現在のシェルのコンテキスト内でシェルリダイレクトが発生することです。実行しようとすると動作sudo /bin/echo abc > /test.file
しません。わかりました-bash: /test.file: Permission denied
。 echoコマンドはスーパーユーザー権限で実行されますが、出力は現在(許可されていない)シェルに印刷され、通常のユーザーとしてそのディレクトリ/
に書き込む権限がありません。
この問題を解決する1つの方法は、次sudo
を使用して新しいシェルを起動することです(上記の例と同様)。
sudo bash -c "echo abc > /test.file"
/
この場合、出力リダイレクトは特権シェル(書き込み特権を持つシェル)のコンテキストで発生します。
tee
別の解決策は、スーパーユーザーとしてコマンドを実行することです。
echo abc | sudo tee /test.file
答え2
cd
またはll
プログラムではありませんが、実際にはシェルに組み込まれたコマンドです。次のコマンドを使用すると、使用可能なすべての組み込みコマンドを表示できます。
複合遺伝子-b
sudo
これらすべてのコマンドには使用できません。
答え3
ll
エイリアスなのでsudoと一緒に使えません。 sudoを使用するとインタラクティブシェルを取得できないため、エイリアスはsudoでは機能しません(特に要求しない限り)。
cd
sudo権限なしでディレクトリに変更することは意味がないため、状況は異なります。
提案に従ってくださいたくさん組み込みコマンドはsudoでは機能しませんが、他のコマンドは機能します。特に、自分と他のユーザーが開始したプロセスを終了するには、kill
実行する必要があります。sudo kill <pid>