~によると須藤(8):
Process model
sudoは、コマンドを実行するときにfork(2)を呼び出し、上記のように実行環境を設定し、サブプロセスでexecveシステムコールを呼び出します。
また、フォークされたサブプロセスがsh
。
したがって、コマンドがいくつかのbash関連コマンド(例えばsource
そのコマンド)を含むbashスクリプトである場合、sh
正しく実行されません。たとえば、
%猫/tmp/wibble 何かソース %ls -l /tmp/wibble -rwxr-xr-x ユーザー 1人 user17 8月24日 08:32 /tmp/wibble %パスワードルートを取得する ルート:x:0:0:ルート:/ルート:/bin/bash % /tmp/スイング /tmp/wibble: 1: /tmp/wibble: ソース: 見つかりません % /bin/bash /tmp/wibble ~ [pts/3.4028.1] /tmp/wibble: 行1: 何か: そのファイルやディレクトリはありません。 % /bin/dash /tmp/wibble /tmp/wibble: 1: /tmp/wibble: ソース: 見つかりません % /bin/sh /tmp/wibble /tmp/wibble: 1: /tmp/wibble: ソース: 見つかりません %エコ$ SHELL /bin/zsh % sudo /tmp/wibble /tmp/wibble: 1: /tmp/wibble: ソース: 見つかりません % sudo -s /tmp/wibble /tmp/wibble: 1: /tmp/wibble: ソース: 見つかりません % sudo -i /tmp/wibble /tmp/wibble: 行1: 何か: そのファイルやディレクトリはありません。 % エクスポート SHELL=/bin/bash % sudo /tmp/wibble /tmp/wibble: 1: /tmp/wibble: ソース: 見つかりません % sudo -s /tmp/wibble /tmp/wibble: 行1: 何か: そのファイルやディレクトリはありません。 % sudo -i /tmp/wibble /tmp/wibble: 行1: 何か: そのファイルやディレクトリはありません。 %
-s
通常、この問題を解決するために前の例のようにオプションを追加できますが、デフォルトが使用されているsudo
理由を知りたいです。これを別のシェルで構成できますか?sudo
sh
ベストアンサー1
スクリプトが#!
適切な-lineで始まることを確認してください。
スクリプトが実行可能で、たとえば次のように始まる場合
#!/bin/bash
(またはシステムへのすべてのパスbash
)の後にスクリプトが続きます。〜する/bin/bash
sudo script
と入力すると、Pythonスクリプトは最初の行がとして解釈される/usr/bin/python
かのように解釈されます#!/usr/bin/python
。
sh
シェルbash
や他のシェルに関する質問はここでは興味深いものではありません。一般的に言えば、各タイプのシェルには相互に排他的なスクリプト言語があるとします。そして#!
-line を使ってスクリプトするインタプリタを正確に指定します。たとえば、POSIX構文と構文のみを使用して移植可能なスクリプトを作成する場合、#!/bin/sh
POSIXシェルを拡張する配列やその他の項目を#!/bin/bash
使用する場合を使用します。bash
テキストファイル#!
。/bin/sh
これとは関係ありませんsudo
。
更新された質問では、-lineなしでスクリプトへの複数の呼び出しを表示します#!
。インタプリタがsource
コマンド(source: not found
)を理解していないか、ファイル(something: No such file or directory
)を見つけることができないため、すべて失敗します。
要約すると、スクリプトのインタプリタを指定するには、常に -line を使用します#!
。
source
また: を使用するとき./something
。$PATH
関連: