我看到-
运算符以不同的命令以不同的方式运行。
例如,
cd -
CD到前一个目录,而,
vim -
从stdin
读取
所以我想知道为什么-
运营商在这里以两种不同的方式行事。 有人可以指点我-
运营商的一些详细的文件?
这不是一个运营商,这是一个论据。 当你用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 */ }
破折号是一个简单的命令参数。 其含义与命令有关。 其两个最常用的含义是“标准输入”或(不太经常的)“标准输出”。 “以前的目录”的含义是内置的cd
shell所独有的(只是在某些shell中,并不是所有的shell)。
cat file1 - file2 | troff ...
这意味着读取file1
,标准输入和file1
,并将输出发送到troff
。
(GNU) tar
一个极端情况是指“标准输入”或“标准输出”
generate_file_list ... | tar -cf - -T - | ( cd /some/where/else; tar -xf - )
第一个tar
的-cf -
选项表示“创建一个存档”,“输出文件是标准输出”。 -T -
选项表示“从标准输入读取文件和/或目录的列表”。
第二个tar
的-xf -
选项表示“提取归档”,“输入文件是标准输入”。 实际上,GNU tar
有一个选项-C /some/where/else
,这意味着它自己做cd
,所以整个命令可以是:
generate_file_list ... | tar -cf - -T - | tar -xf - -C /some/where/else
这样做的最终结果是将由“当前目录”下的generate_file_list
命令命名的文件复制到/some/where/else
,以保留目录结构。 ('当前目录'必须用一小撮盐;任何绝对文件名由GNU tar
给予特殊处理 – 它删除前导斜杠 – 并且相对于当前目录取相对名称。)
这取决于它正在使用的程序。它对不同的程序意味着不同的事情。
我觉得不同的程序使用不同的约定。 manpages显示了每个程序如何解释 – 这里是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.