2012-03-12 8 views
4

-オペレータは、異なるコマンドで異なる方法で動作することがわかります。Linuxでは ' - '演算子は実際に何をしていますか?

vim - 

stdinは、だから私は-オペレータが異なる2で動作している理由を知りたいから読み込み、一方、例えば

、前のディレクトリに

cd - 

CDS、ここには道がある。誰かが-オペレータの詳細な文書を私に指摘できますか?

答えて

11

これは演算子ではなく、引数です。 CやC++でプログラムを書くときは、argv[1](最初の引数のとき)になり、好きなことをすることができます。

通常、多くのプログラムでは、入力ファイル名が通常必要なstdinのプレースホルダとして-を使用し、出力ファイル名が必要なstdoutを使用します。しかしcdは、ファイルストリームを読み込む必要はありません。なぜstdinまたはstdoutが必要ですか?

追加:vimのmain.cから抜粋して、-で始まる引数を解析します。追加の文字がない場合は、STDIN入力を有効にします。

else if (argv[0][0] == '-' && !had_minmin) 
    { 
     want_argument = FALSE; 
     c = argv[0][argv_idx++]; 
#ifdef VMS 
     ... 
#endif 
     switch (c) 
     { 
     case NUL:  /* "vim -" read from stdin */ 
       /* "ex -" silent mode */ 
     if (exmode_active) 
      silent_mode = TRUE; 
     else 
     { 
      if (parmp->edit_type != EDIT_NONE) 
      mainerr(ME_TOO_MANY_ARGS, (char_u *)argv[0]); 
      parmp->edit_type = EDIT_STDIN; 
      read_cmd_fd = 2; /* read from stderr instead of stdin */ 
     } 
+0

詳細な回答をいただきありがとうございます。異なる(標準的な)コマンドがどのようにそれを使用するかをどのように知るべきですか?プログラムがそれを使う方法を決めるなら、 '!'や '#'のような他の記号はどうしていいですか? –

+0

@Stacker:まともなプログラムには良い文書があります。プログラムを呼び出す方法とコマンドラインで受け付けるものについては、文書化する必要があります。 vimでは、簡単ではないことを認めていますが、 ':help - 'で見つけることができます(どのように混乱しますが、 ':help'は通常モードの' -'コマンドに行きます)。 – Benoit

1

これは、使用されているプログラムによって異なります。これは、異なるプログラムとは異なることを意味します。

0

私は別のプログラムで別の規約を使うと思います。ここでは、man bash

- 
    At shell startup, set to the absolute pathname used to invoke the shell 
    or shell script being executed as passed in the environment or argument list. 
    Subsequently, expands to the last argument to the previous command, after expansion. 
    Also set to the full pathname used to invoke each command executed and placed 
    in the environment exported to that command. When checking mail, this parameter 
    holds the name of the mail file currently being checked. 

man vim

- The file to edit is read from stdin. Commands are read from stderr, 
    which should be a tty. 
2

、独自のダッシュは、単純なコマンド引数である - manページには、各プログラムがどのように解釈するかを示しています。その意味はコマンドに依存します。その最も一般的な意味の2つは、「標準入力」または(それほど頻繁にはない)「標準出力」です。 '以前のディレクトリ'の意味は、cdシェルに固有のものです(シェルによっては、すべてのシェルではなく、一部のシェルでのみ意味されます)。

cat file1 - file2 | troff ... 

これは、順番にfile1、標準入力、およびfile2を読み、troffに出力を送信意味。

「標準入力」または「標準出力が」(GNU)から来ている意味する-を使用しての極端な場合tar

generate_file_list ... | 
tar -cf - -T - | 
(cd /some/where/else; tar -xf -) 

最初tar-cf -オプション「アーカイブを作成」を意味すると '出力ファイルは標準出力です '; -T -オプションは、 '標準入力からファイルおよび/またはディレクトリのリストを読み込み'を意味します。

tarの2番目のオプションは、「アーカイブを抽出する」と「入力ファイルは標準入力です」を意味します。実際には、GNU tarは、それがcd自体を行う意味オプション-C /some/where/elseを持っているので、全体のコマンドは次のようになります。

generate_file_list ... | 
tar -cf - -T - | 
tar -xf - -C /some/where/else 

本の正味の効果は、「下からgenerate_file_listコマンドで指定されたファイルをコピーすることです現在のディレクトリ 'を/some/where/elseに変更し、ディレクトリ構造を保存します。 (現在のディレクトリは小さなピンチで取る必要があります。絶対ファイル名はGNU tar —によって特別扱いされます。—の先頭のスラッシュは削除され、相対名はカレントディレクトリからの相対名として扱われます)

+0

+1と詳細な答えに感謝します。 –

関連する問題