`-`仅用于cd吗?


45

cd - 可以在当前目录和上一个目录之间切换。

似乎以前我曾经-将其用作其他命令的参数,尽管我不记得它的-含义是否与with相同cd

我发现-不适用于ls

难道- 只有在用CD?


8
要记住的是,它cd是内置的,而不是外部命令(它甚至也不会以任何方式工作)。cd -因此是shell级别的功能。
蓬松的

6
我一直都在git checkout -切换到上一个分支
2014年

@fluffy:是否-以相同的方式与其他内置函数一起使用?
2014年

对于某些目录处理内置函数pushd,是。否则,“上一个目录”的含义不是非常有用的默认值。
蓬松的

1
也许您正在考虑bash的“〜-”功能(被解释为$ OLDPWD)。可以按照您描述的方式与“ ls”一起使用。
abonet 2014年

Answers:


22

POSIX实用程序语法准则(具体#13)指定为期望的文件名,从读公用事业-装置标准输入,以及用于该期望的文件名写入到,公用事业-装置标准输出。例如,cat somefile -将的内容复制somefile到其标准输出,然后将其在其标准输入上读取的内容复制。

该准则不适用于该cd命令,因为它不会读取或写入文件。cd所做的事情有所不同:参数的-意思是“上一个目录”。该命令cd -等效于cd "$OLDPWD" && pwd。此行为特定于cd命令以及直接启发的命令(例如)pushd

请注意,这-是一个操作数,而不是一个选项。仅以-和开头的参数不等于---为选项。作为操作数的主要含义是--不影响其特殊含义。例如,cd -- -P更改为子目录-P,但cd -- -与相同cd -,但不更改为子目录-。同样,cat -- -不是从称为-标准输入的文件中读取文件。


46

-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不属于这些实用程序,因此-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.

36

cd -实际上是的简写cd "$OLDPWD" && pwd$OLDPWD每次将目录更改为您所在的目录时都会在设置。

处理-取决于应用程序。一些应用程序-用来表示STDIN,例如grepawk

其他应用程序可以-用作他们选择的任何内容的简写,正如Michael的答案所指定的su-是的简写。--login


是的,确实没有规则。
2014年

2
@Kiwy:对于POSIX,有一个规则,请参阅我的答案。
cuonglm

确切地说,有一个通用规则,但是有很多例外。在规则之前还有许多命令,或者尚未更新以符合规则的旧实现。
Barmar 2014年

19

尽管Michael提到,su并且其他应用程序可以-用来表示他们想要的任何东西(从stdin读取是很常见的),但是Git确实-以类似于how的cd方式用于更改分支。

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

任何程序都可以-用作参数,表示它们想要的任何内容。一个常见的示例是su,它-用作的简写--login。我能想到的唯一约定是,从文件读取的程序经常-用来表示“从stdin读取”,但这完全取决于程序


是否有使用特殊符号作为参数的标准或非标准约定?
蒂姆(Tim)

2

在这里加两分钱。我用'-'来告诉ps2pdf工具从标准输入中读取内容,正如之前几个人所建议的那样:

man -t ls | ps2pdf - ls.pdf

上面的单行代码在当前目录中为ls创建了手册页的pdf版本。
希望有人觉得它有用:)。


2

正如gnouc回答的,在...中-有自己的含义cd

但是,您可以-使用在其他程序中复制的行为~-。例如:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.