在 bash 命令替换中使用换行符进行拆分

在 bash 命令替换中使用换行符进行拆分

假设我有一个目录,其中包含三个文件,其名称包括空格:a bc de 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重新启用它)。而且,如果您的文件名包含换行符,那将不起作用,但我想您知道这一点。

相关内容