web-dev-qa-db-ja.com

`-`はcdでのみ使用されますか?

cd -は、現在のディレクトリと以前のディレクトリを切り替えることができます。

見たことがあるようです-は以前は他のコマンドの引数として使用されていましたが、-cdと同じことを意味します。

見つけた -lsでは機能しません。

-はCDでのみ使用されますか?

45
Tim

POSIXユーティリティ構文ガイドライン (特に#13)は、ファイル名の読み取りを想定しているユーティリティの場合、-は標準入力を意味し、ファイル名の書き込みを想定しているユーティリティの場合は、 、-は標準出力を意味します。たとえば、cat somefile -somefileの内容を標準出力にコピーし、その後に標準入力で読み取った内容をコピーします。

このガイドラインは、ファイルの読み取りまたは書き込みを行わないため、cdコマンドには適用されません。 cd は何か別のことを行います。引数-は「前のディレクトリ」を意味します。コマンドcd -cd "$OLDPWD" && pwdと同等です。この動作は、cdコマンド、およびpushdなどの直接インスパイアされたコマンドに固有です。

-はオペランドではなく、オプションであることに注意してください。 -で始まり、-または--だけではない引数のみがオプションです。オペランドであることの主な意味は、--がその特別な意味に影響を与えないことです。たとえば、cd -- -P-Pというサブディレクトリに変更されますが、cd -- -cd -と同じであり、-というディレクトリには変更されません。同様に、cat -- --というファイルからは読み取れませんが、標準入力から読み取ります。

-POSIXユーティリティ構文ガイドライン で標準入力として定義されています。

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

読み取りまたは書き込み用にファイルを操作するユーティリティのこの定義を確認できます。 cdはこれらのユーティリティに属していないため、- in cdはこのガイドラインに従っていません。

さらに、POSIXは-cd で独自の意味を持っています:

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.
46
cuonglm

cd -は、実際にはcd "$OLDPWD" && pwdの省略形です。ここで、$OLDPWDは、ディレクトリを現在のディレクトリに変更するたびに設定されます。

-の処理は、アプリケーションによって異なります。一部のアプリケーションは-を使用してSTDINを示します。 grepawk

他のアプリケーションは、マイケルの回答が指定するように、suを使用して、--の省略形として、--loginを選択するものの省略形として使用できます。

36
Lawrence

マイケルはsuおよび他のアプリケーションが-は、彼らが望むものを意味します(stdinから読み取るのが一般的です)Gitは-は、ブランチを変更する場合のcdと同様の方法でです。

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master
19
dotancohen

どのプログラムでも、-を引数として使用して、好きなことを意味できます。一般的な例の1つはsuで、-の省略形として--loginを使用します。私が考えることができる唯一の規則は、ファイルから読み取るプログラムが頻繁に-を使用して "read from stdin" を意味することですが、それは完全にプログラム次第です

18
Michael Mrozek

gnouc で回答されているように、cdでは-が独自の意味を持っています。

ただし、-を使用すると、他のプログラムで~-の動作を複製できます。例えば:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim

ここに2セントを追加します。私は「-」を使用してps2pdfツールに標準入力から読み取るように指示しています。

man -t ls | ps2pdf - ls.pdf

上記のワンライナーは、現在のディレクトリにlsのマニュアルページのPDFバージョンを作成します。
誰かがそれが便利だと思ってほしい:).

2
gacanepa