shの代わりにsudoフォークbashを作成する方法は?

shの代わりにsudoフォークbashを作成する方法は?

~によると須藤(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理由を知りたいです。これを別のシェルで構成できますか?sudosh

ベストアンサー1

スクリプトが#!適切な-lineで始まることを確認してください。

スクリプトが実行可能で、たとえば次のように始まる場合

#!/bin/bash

(またはシステムへのすべてのパスbash)の後にスクリプトが続きます。〜する/bin/bashsudo scriptと入力すると、Pythonスクリプトは最初の行がとして解釈される/usr/bin/pythonかのように解釈されます#!/usr/bin/python

shシェルbashや他のシェルに関する質問はここでは興味深いものではありません。一般的に言えば、各タイプのシェルには相互に排他的なスクリプト言語があるとします。そして#!-line を使ってスクリプトするインタプリタを正確に指定します。たとえば、POSIX構文と構文のみを使用して移植可能なスクリプトを作成する場合、#!/bin/shPOSIXシェルを拡張する配列やその他の項目を#!/bin/bash使用する場合を使用します。bash

テキストファイル#!/bin/shこれとは関係ありませんsudo

更新された質問では、-lineなしでスクリプトへの複数の呼び出しを表示します#!。インタプリタがsourceコマンド(source: not found)を理解していないか、ファイル(something: No such file or directory)を見つけることができないため、すべて失敗します。

要約すると、スクリプトのインタプリタを指定するには、常に -line を使用します#!

sourceまた: を使用するとき./something$PATH

関連:

おすすめ記事