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

use*_*271 1 bash

是否有可能使用basename,并readlink在同一行?就像是:

ln -s /usr/local/src symlink
echo `basename <(readlink -f "./symlink")`
Run Code Online (Sandbox Code Playgroud)

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

ran*_*mir 5

使用命令替换而不是进程替换:

echo "$(basename "$(readlink -f "./symlink")")"
Run Code Online (Sandbox Code Playgroud)

或者,如果那是你的完整线,那echo就是多余的:

basename "$(readlink -f "./symlink")"
Run Code Online (Sandbox Code Playgroud)

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

澄清区别:当你说<(cmd),cmd执行并且结果在文件中可用,返回的句柄就像是/dev/fd/63.由于对basename给定文件名的行为而不是其内容,它返回63.

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