在csh中,ls -1的工作方式与预期不符。

3
我想要按行列出目录中的所有文件,为此我使用了以下示例Shell脚本:
ls -1 /path/to/directory
#!/bin/sh
MY_VAR="$(ls -1)"
echo "$MY_VAR"

这个操作按预期运行,但是如果使用csh执行同样的操作,则如下所示:

#!/bin/csh
set MY_VAR = `ls -1`
echo $MY_VAR

它会将所有文件输出在一行中,然后每行打印一个文件。

有人能解释一下为什么在csh中ls -1不能按预期工作吗?


1
强制阅读Csh编程有害。然后切换到bashzsh - Basile Starynkevitch
1
嗯?ls -1完美运行。问题出在命令替换上。任何发出多行的其他命令都会有相同的行为。 - Charles Duffy
1个回答

1

来自 man csh,强调我的:

命令替换

命令替换由用``'括起来的命令表示。从这样的命令输出在空格、制表符和换行符处被分成单独的单词,并且空单词被丢弃。输出是可变的并且由命令替换并放置在原始字符串的位置。

双引号内的命令替换保留空格和制表符;只有换行符强制新的单词。单个最终换行符在任何情况下都不会强制产生新单词。因此,即使命令输出完整的一行,命令替换也可能只产生单词的一部分。

默认情况下,自版本6.12以来,shell将命令中的所有换行符和回车符替换为空格。如果通过取消设置csubstnonl来关闭此功能,则换行符将像往常一样分隔命令。

条目被分配在列表中;您可以使用例如echo $MY_VAR[2]访问单个条目。

这与Bourne shell不同,后者没有“列表”的概念,变量始终是字符串。
要在单行上打印所有条目,请使用foreach循环:
#!/bin/csh
set my_var = "`ls -1`"

foreach e ($my_var)
    echo "$e"
end

建议在`ls -1`周围加上双引号,这样可以确保当您的文件名中有空格时它能正常工作(否则这些文件将显示为两个单词/列表条目)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接