入力したら
::
バッシュシェルに、私は得る:
-bash: ::: command not found
ただし、1つだけが:
出力されません。どうしてこれなの?
入力したら
::
バッシュシェルに、私は得る:
-bash: ::: command not found
ただし、1つだけが:
出力されません。どうしてこれなの?
回答:
:
シェルは、内蔵の非存在VS::
:
組み込みコマンドシェルは、(注意存在し、外部と内蔵のコマンドの違いを何もしないもの)。true
コマンドと同様に、成功を返すだけです。:
内蔵の標準とあるPOSIX標準によって定義され、それはまた、「ヌル・ユーティリティ」として知られています、。テストや、次のような無限ループの実行によく使用されますwhile : ; do ...;done
bash-4.3$ type :
: is a shell builtin
ただし、::
2つのコロン文字は一緒に-シェルに対して1つの「単語」として解釈され、ユーザーが入力したコマンドであると想定されます。シェルは、ビルトインをチェックするプロセスを経てから、PATH
そのコマンドの存在について変数内のディレクトリをチェックします。ただし、組み込み::
コマンドも外部コマンドもありません::
。したがって、エラーが発生します。
さて、エラーの典型的な形式は何ですか?
<shell>: <command user typed>: error message
したがって、表示されるのは3つのコロンではなく、標準エラー形式に貼り付けたものです。
また、:
コマンドライン引数をとることができることに注意してください。つまり、次のようにすることは正当です。
: :
この場合、シェルは2つの「単語」とみなします。1つはコマンドで、もう1つは位置パラメータです。また、エラーも発生しません!(:
位置パラメータでのofの使用に関する履歴ノート(この回答の後半を参照)
書式はシェルによっても異なる可能性があることに注意してください。以下のためにbash
、ksh
とmksh
行動が一致しています。たとえば、Ubuntuのデフォルト/bin/sh
シェル(実際には/bin/dash
):
$ dash
$ ::
dash: 1: ::: not found
1はコマンド番号(スクリプトの行番号に相当)です。
csh
対照的に、エラーメッセージはまったく生成されません。
$ csh
% ::
%
実際、を実行するstrace -o csh.trace csh -c ::
と、csh.trace
ファイル内のトレース出力から、csh
終了ステータス0(エラーなし)で終了することがわかります。ただしtcsh
、エラーは出力されます(ただし、名前は出力されません)。
$ tcsh
localhost:~> ::
::: Command not found.
一般に、エラーメッセージの最初の項目は実行中のプロセスまたは関数である必要があります(シェルが実行を試みる::
ため、エラーメッセージはシェルから送信されます)。たとえば、実行プロセスはstat
次のとおりです。
$ stat noexist
stat: cannot stat 'noexist': No such file or directory
実際、POSIXはperror()関数を定義します。これは、ドキュメントによると、文字列引数を取り、コロンの後にエラーメッセージを出力し、次に改行を出力します。見積もり:
perror()関数は、シンボルerrnoを介してアクセスされるエラー番号を言語依存のエラーメッセージにマップし、次のように標準エラーストリームに書き込まれます。
最初(sがNULLポインターでなく、sが指す文字がNULLバイトでない場合)、sが指す文字列の後にコロンと<スペース>が続きます。
次に、エラーメッセージ文字列の後に<newline>が続きます。
perror()
技術的には文字列引数は何でも構いませんが、もちろんわかりやすくするために、通常は関数名またはargv[0]
です。
対照的に、 GNUにはエラー処理用の関数と変数の独自のセットがあり、プログラマーはこれらを使用しfprintf()
てstderr
ストリーミングできます。リンクされたページの例の1つが示すように、次のようなことができます。
fprintf (stderr, "%s: Couldn't open file %s; %s\n",
program_invocation_short_name, name, strerror (errno));
古いUnixおよびThompsonシェルで:
は、goto
ステートメントで使用されました(このスレッドの Perderaboという名前のユーザーによると、これは組み込みのシェルではありませんでした)。マニュアルから引用:
コマンドファイル全体で、最初の非空白文字として:で始まり、1つ以上の空白が続き、次にラベルが続く行が検索されます。そのような行が見つかった場合、gotoはコマンドファイルオフセットをラベルの後の行に再配置して終了します。これにより、シェルがラベル付き行に転送されます。
したがって、無限ループスクリプトを作成するには、次のようなことを行うことができます。
: repeat
echo "Hello World"
goto repeat
command.com
とWindowsにcmd.exe
は似たような反対の状況があります::
明示的にgotoラベル(コマンドではなく)であり、多くの場合、コメント文字として再利用されます(例:: This is a comment
)。
最後のコロンは、デフォルトの「not found」メッセージの一部です。
$ x
x: command not found
$ ::
::: command not found
単一のコロンが何も生成しない理由は、それ:
が有効なコマンドであることです-ただし、何も実行しません(returnを除くTRUE
)。のSHELL BUILTIN COMMANDS
セクションからman bash
:
: [arguments]
No effect; the command does nothing beyond expanding arguments
and performing any specified redirections. A zero exit code is
returned.
あなたは時々のような構造でそれを見るでしょう
while :
do
something
done
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found
3番目はフォーマットからのスペーサーです
bashでは:
、空行のvoid命令です。