是否可以在一行中使用basename
和readlink
?类似的东西:
ln -s /usr/local/src symlink
echo `basename <(readlink -f "./symlink")`
除了上面的脚本打印63
而不是src
。
答案 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)"
。