bashのコマンド(::)としての2つのコロンのエラーメッセージには3つのコロンがありますが、単一のコロンでは何も出力されないのはなぜですか?


27

入力したら

::

バッシュシェルに、私は得る:

-bash: ::: command not found

ただし、1つだけが:出力されません。どうしてこれなの?


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
トーマスウォード

これはUbuntuにどのように関連していますか?
NerdOfCode

@NerdOfCode同じ方法ですか?meta.askubuntu.com/q/17076/158442
muru

回答:


40

:シェルは、内蔵の非存在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以外のシェルで

書式はシェルによっても異なる可能性があることに注意してください。以下のためにbashkshmksh行動が一致しています。たとえば、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

「3つのコロン」の「3列」のタイプミス
Barmar

1
DOS command.comとWindowsにcmd.exeは似たような反対の状況があります::明示的にgotoラベル(コマンドではなく)であり、多くの場合、コメント文字として再利用されます(例:: This is a comment)。
grawity

54

最後のコロンは、デフォルトの「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

たとえば、コロンの組み込み機能はどのような目的に使用されますか?


ええ、これは...私より最も包括的なコメント..はるかに雄弁でより良い説明:D
ジョン・オリオン

8

存在しない他のコマンドを試してみると:、英語でその通常の目的を果たしていることがわかります。

$ ---
---: command not found

6

追加されたコロンは、エラーメッセージ自体の一部です。1種類であればcd ow、それは、その結果bash: cd: ow: No such file or directoryエラーが、余分なコロンに入れていることを示し、: No such file or directory


6
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found

3番目はフォーマットからのスペーサーです

bashでは:、空行のvoid命令です。


4

エラー形式にコロンが含まれているため、3つのコロンが表示されます。

bash: <command>: command not found
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.