如何“touch”和“cat”名为“-”的文件

如何“touch”和“cat”名为“-”的文件

如何使用 GNUtouch更新名为 的文件-

如何使用 GNUcat显示名为 的文件-


我在跑:

% cat --version | head -n1
cat (GNU coreutils) 8.29
% touch --version | head -n1
touch (GNU coreutils) 8.29

首先,touch

% touch -
% ls -l
total 0
% touch -- -
% ls -l -- -
ls: cannot access '-': No such file or directory

好吧,我将放弃使用touch.让我们用date以下命令来创建它:

% date > -
% ls -l -
-rw-r--r-- 1 ravi ravi 29 Sep  8 19:54 -
%

现在,让我们尝试cat一下:

% cat -
% # I pressed ^D
% cat -- -
% # Same again - I pressed ^D

我知道我可以解决以下问题:

% > -

% cat < -

但是为什么这些 GNU utils 不支持约定,即--后面的所有内容都被视为非选项?

在一般情况下如何使用这些工具,例如我有一个包含内容的变量-

答案1

使用文件的显式路径:

touch ./-
cat ./-

GNU特别touch对待文件操作数-

FILE 参数字符串-经过特殊处理,会导致touch更改与标准输出关联的文件的时间。

为了catPOSIX 标准指定文件操作数-应解释为从标准输入读取的请求。

双破折号约定仍然有效,但这并不是为了标志着论点但结束时选项。在这两种情况下,都不会-被视为选项(单独的选项-不能是选项),而是被视为操作数(“文件名参数”)。


关于你的最后一个问题:

保护变量的内容在使用时不被解释为一组选项

utility "$variable"

使用

utility -- "$variable"

请注意,如果实用程序是catsedawkpaste以及sort可能的其他一些(或 GNU touch),并且$variable-,这仍然会导致实用程序执行其特殊处理,因为如上所述,-这不是一个选项。相反,请做出规定,以便文件名(如果它们可能以 开头或等于-)前面带有路径,例如./当前工作目录中的文件。

一个好的习惯是使用

for filename in ./*; do

而不是

for filename in *; do

例如。

相关内容