2017-08-31 116 views
3

我想列出的所有目录中的文件一行层出不穷,为此我使用一个样本shell脚本如下工作不LS -1如预期在csh

#!/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编程](http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)。然后切换到'bash'或[zsh](http://zsh.org/) –

+1

呃? 'ls -1'完美无缺。这是没有表现的命令替换。任何其他发出多行的命令都会有相同的行为。 –

回答

1

man csh,重点煤矿:

命令替换

命令替换被封闭在``”的命令表示。 从这样的命令输出的 在空白处被分成单独的词, 选项卡和换行符,并且空字被丢弃。输出是vari- 能够和命令替换并放置在原始字符串的地方。

命令替换双引号('“')保留空白和 制表符;只有换行强制新单词的单个最终换行符不会在任何情况下 力的新词因此,可以为一个命令。子 stitution产生一个字中的一部分,即使命令输出 完整产品线。

默认情况下,壳,因为6.12版本替换所有换行符和小车 - riage返回字符的空格命令。如果通过取消设置csubstnonl来切换 ,则换行符会将命令分隔为u西伯利亚乌拉尔铝业公司。

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

这与Bourne shell不同,它没有“list”的概念,变量总是字符串。

要打印的所有条目在一行,使用foreach循环:

#!/bin/csh 
set my_var = "`ls -1`" 

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

添加`ls -1`周围双引号建议,因为这将确保它正常工作时,你有文件名用空格(否则这些文件将显示为两个单词/列表条目)。