在bash中,"set - $VARIABLE" 是什么意思?

3

最近,我在第7章的“读取用户输入”一节中阅读了《学习bash Shell》第3版。当我看到下面的代码时,

echo 'Select a directory:'
done=false

while [ $done = false ]; do
        do=true
        num=1
        for direc in $DIR_STACK; do
                echo $num) $direc
                num=$((num+1))
        done
        echo -n 'directory? '
        read REPLY

        if [ $REPLY -lt $num ] && [ $REPLY -gt 0 ]; then
                set - $DIR_STACK

                #statements that manipulate the stack...

                break
        else
                echo 'invalid selection.'
        fi
done

set - $DIR_STACK的确切含义是什么?


这取决于命令。我建议阅读有关该命令的手册页面。对于set命令,您必须阅读Bash手册页面,因为它是一个内部命令。 - Some programmer dude
1
这几乎肯定是一个错误,他们想要运行 set -- $DIR_STACK。这本身就是一种非常糟糕的做法。(顺便说一下,for direc in $DIR_STACK 也是如此。) - Charles Duffy
一个好的参考资料也不会显示未引用扩展和非内置变量的全大写名称(请参阅相关的POSIX标准,第四段,有关变量命名的指南; 全大写名称由对系统特殊的环境变量使用,但设置类似命名的shell变量将覆盖任何此类环境变量)。 - Charles Duffy
排版工具通常会将“--”替换为破折号,因此我想知道这个问题是否是在发布过程中插入的。 - Charles Duffy
谢谢您的建议,我会仔细看一下。 :) - Give_me_5_dolloars
显示剩余2条评论
1个回答

6
这将对$DIR_STACK的内容进行字符串拆分和通配符扩展,将第一个放入$1,第二个放入$2等。这不是一个好习惯 - 书写良好的脚本不依赖于字符串拆分(请参见BashPitfalls顶部的建议,下面许多错误都是由于没有遵循该建议而导致的)。
更正式的写法是使用--而不是-。这是由POSIX实用程序语法指南定义的,第10条目:
引用:

第一个非选项参数的--应被接受为指示选项结束的分隔符。任何后续参数都应视为操作数,即使它们以-字符开头。


使用set来更改参数列表($1$2等)也是POSIX指定的,尽管(再次)标准指定使用--而不是-
引用:

剩余的参数(在处理选项后)应按顺序分配给位置参数。特殊参数#应设置为反映位置参数的数量。在分配任何新值之前,所有位置参数都必须未设置。

如果第一个参数以+-开头,或者当没有参数时要防止意外列出所有shell变量,则可以使用紧随set命令名称的特殊参数--来分隔参数。没有参数的命令set --将取消所有位置参数并将特殊参数#设置为零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接