为什么" basename<(readlink -f filename)"返回" 63",而不是实际的基名?

时间:2017-11-05 15:18:28

标签: bash

是否可以在一行中使用basenamereadlink?类似的东西:

ln -s /usr/local/src symlink
echo `basename <(readlink -f "./symlink")`

除了上面的脚本打印63而不是src

1 个答案:

答案 0 :(得分:5)

使用command substitution代替process substitution

echo "$(basename "$(readlink -f "./symlink")")"

或者,如果那是您的完整行,echo是多余的:

basename "$(readlink -f "./symlink")"

多个$(..)命令替换可以嵌套,无需任何转义或引用(与旧式反引用版本不同)。另请注意,如果替换出现在双引号内,则不会对结果执行分词和文件名扩展。

澄清区别:当您说<(cmd)时,cmd已执行且结果在文件中 ,处理返回的内容,如/dev/fd/63。由于basename对给定的文件名而不是其内容起作用,因此返回63

与进程替换不同,$(cmd)将执行cmd并返回命令结果(其标准输出)。然后,您可以将其存储在变量中,例如res=$(cmd),或者就地重用它,例如cmd "$(cmd)"