ls -1在csh中没有按预期工作

时间:2017-08-31 09:29:29

标签: shell csh

我想列出一个接一个的目录中的所有文件,我正在使用示例shell脚本,如下所示

#!/bin/sh
MY_VAR="$(ls -1)"
echo "$MY_VAR"

这按预期工作,但是如果使用csh执行相同操作,则如下:

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

它输出一行中的所有文件,而不是每行打印一个文件。

任何人都可以解释为什么在csh ls -1中没有按预期工作。

1 个答案:

答案 0 :(得分:1)

来自man csh,强调我的:

  

命令替换

     

命令替换由``'括起来的命令指示。的的      这样一个命令的输出在空白处分成单独的单词,      制表符和换行符,并删除空字。输出是变量      能够和命令替换并代替原始字符串。

     

命令替换在双引号内(`“')保留空格和      标签;只有新行强制新词。单个最终换行没有      在任何情况下强制换一个新词。因此可以使用命令子      即使命令输出a,也只能产生一个单词的一部分      完整的一行。

     

默认情况下,自版本6.12以来的shell替换所有换行符和car-      riage按空格返回命令中的字符。如果这是切换      通过取消设置csubstnonl,newlines像往常一样单独命令。

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

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

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

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

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

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