如何使用 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
更改与标准输出关联的文件的时间。
为了cat
,POSIX 标准指定文件操作数-
应解释为从标准输入读取的请求。
双破折号约定仍然有效,但这并不是为了标志着论点但结束时选项。在这两种情况下,都不会-
被视为选项(单独的选项-
不能是选项),而是被视为操作数(“文件名参数”)。
关于你的最后一个问题:
保护变量的内容在使用时不被解释为一组选项
utility "$variable"
使用
utility -- "$variable"
请注意,如果实用程序是cat
、sed
、awk
、paste
以及sort
可能的其他一些(或 GNU touch
),并且$variable
是-
,这仍然会导致实用程序执行其特殊处理,因为如上所述,-
这不是一个选项。相反,请做出规定,以便文件名(如果它们可能以 开头或等于-
)前面带有路径,例如./
当前工作目录中的文件。
一个好的习惯是使用
for filename in ./*; do
而不是
for filename in *; do
例如。