1

我见过一个修改 Unix $PATH 的脚本,为了避免重复项目,它使用了以下技术:

set path = ($path:q /some/new/path)
set path = ($path:q /another/directory)
set -f path = ($path:q)

不明白怎么操作...

“-f”标志的文档说:

禁用文件名生成

这对我来说没有任何意义。这个奇怪的“:q”是什么?

谢谢!

编辑

这个超级用户问题帮助我理解了“:q”是一个修饰符。tcsh man解释说:

当 `:q' 修饰符应用于替换时,变量将扩展为多个单词,每个单词用空格分隔并引用以防止以后的命令或文件名替换

第二次编辑:

实际上,似乎只有“-f”才能发挥作用:

~$ set days = (Sunday Monday Tuesday Monday Sunday)
~$ echo $days
Sunday Monday Tuesday Monday Sunday
~$ set -f days = ($days)
~$ echo $days
Sunday Monday Tuesday

不过,我不明白“禁用文件名生成”的结果如何。

4

2 回答 2

1

如果我们遇到包含*,?等的文件名,通常需要禁用文件名生成{}。在处理这些文件时应小心,以免我们将文件名作为通配符模式处理。创建一个名为 stack* as 的文件vim stack*,稍后我们不应该删除此文件,因为所有其他以开头的文件stack也会被删除。删除文件的另一种方法是使用引用为rm "stack*". 如果需要,可以set +f在 shell 中启用文件名生成。

于 2012-12-18T14:07:59.187 回答
0

您的困惑源于您正在阅读ksh手册,但您正在使用tcsh外壳。 Tcsh语法与更常见的 POSIX shell 语法有很大不同。

该命令set是内置在 shell 中的,因此当您在其中运行时settcsh您会得到一个完全不同的命令来set运行ksh.

来自man tcsh

   set [-r] [-f|-l] name=(wordlist) ... (+)
           ...
           If -f or -l are specified,  set only unique words keeping their
           order.   -f  prefers the first occurrence of a word, and -l the
           last.
于 2012-12-19T21:24:36.257 回答