假设我有一个目录,其中包含三个文件,其名称包括空格:a b
、c d
和e f
。我想用来vi
编辑前两个文件。我想要的 bash 命令是
vi "a b" "c d"
我还想ls
使用 获取前两行命令head
,以便我可以替换第一个命令的参数:
ls | head -n 2
但是,如果我运行vi $(ls | head -n 2)
,它相当于vi a b c d
,这不是我想要的,因为里面的输出$()
被空格和换行符分割。有没有办法只用换行符分割输出?
答案1
有没有办法只用换行符分割输出?
是的,设置IFS
为仅一个换行符(默认情况下它包含一个空格、一个制表符和一个换行符):
IFS=$'\n'
vi $(ls | head -n 2)
($''
是非标准的,但可以在 Bash/ksh/zsh 中使用,并且比其他替代方案更漂亮。)
也就是说,您仍然遇到文件名可能包含全局字符的问题。要禁用通配符,您需要set -f
首先使用(然后set +f
重新启用它)。而且,如果您的文件名包含换行符,那将不起作用,但我想您知道这一点。