如何链接命令,即使一个命令的输出成为另一个命令的输入?
basename | dirname /dev/null
预期输出:
dev
实际输出:
usage: basename string [suffix]
basename [-a] [-s suffix] string [...]
/dev
还尝试了以下方法,但也不起作用:
dirname /dev/null | basename
答案1
它应该是:
basename "$(dirname /dev/null)"
尽管对于无法保证路径组件不会以 开头的任意文件路径-
,您需要添加一些--
s 来标记选项的结尾:
basename -- "$(dirname -- "$file")"
$(...)
可用于运行命令并收集输出以用作另一个程序的命令行参数。
请注意,因为$(...)
删除了全部命令输出中的尾随换行符,上述内容仍然不适用于任意文件路径;在上面的示例中,目录名以换行符结尾的目录。解决这个问题虽然可能,但非常痛苦,以至于这个问题通常被忽视。
在 zsh shell 中,可以使用 csh 样式修饰符来获取不存在问题的文件的t
ail (basename) 或ead (dirname):h
tail_of_head=$file:h:t
这些修饰符也可以在vim
.它们也可以在 中使用bash
,但仅用于历史扩展,而不是像 csh 或 zsh 中那样的参数扩展。