@anishsane 正确回答了主题问题(即ls
进行包装和删除它们的方法)并涵盖了引用问题,但引用问题负责行数差异而不是ls
.
这里的问题完全是引用以及命令行、回显和命令替换如何工作的问题。
的输出"$(ls ...)"
是一个带有嵌入换行符的字符串,通过引号保护免受外壳程序的影响。将该值交给echo
并按echo
字面意思吐出(使用换行符)。
的输出$(ls ...)
是一个不受 shell 保护的字符串,因此会进行分词和空白规范化。命令替换不能提前终止您的命令行(您不希望echo $(ls -1)
在有两个文件的目录中运行echo first_file; second_file
,对吗?)换行符作为echo
. shell 然后 word 将结果拆分为空格(包括换行符),并为 echo 提供一个参数列表,在该列表中echo
愉快地执行echo first_file second_file ...
,您可以猜到,它只输出一行输出。
试试这个看看我的意思:
$ c() {
printf 'argc: %s\n' "$#";
printf 'argv: %s\n' "$@"
}
$ ls *
a.sh b.sh temp
$ ls -1dmb *
a.sh, b.sh, temp
$ c "$(ls -1dmb *)"
argc: 1
argv: a.sh, b.sh, temp
$ c $(ls -1dmb *)
argc: 3
argv: a.sh,
argv: b.sh,
argv: temp