シェルリダイレクト

シェルリダイレクト

のようなコマンドを実行すると、cd実行が「中断」するコマンドがあります。llsudo

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

通常、シェル組み込みおよび外部コマンドで提供されるコマンドの他の例には killtest[)、およびがあります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

おすすめ記事