【问题标题】:ls -1 is not working as intended in cshls -1 在 csh 中没有按预期工作
【发布时间】:2018-02-09 04:55:42
【问题描述】:

我想逐行列出目录中的所有文件,为此我使用了一个示例shell脚本,如下所示

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

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

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

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

谁能解释为什么在 csh ls -1 中没有按预期工作。

【问题讨论】:

  • 必读Csh programming considered harmful。然后切换到bashzsh
  • 嗯? ls -1 完美运行。这是未执行的命令替换。发出多行的任何其他命令都将具有相同的行为。

标签: shell csh


【解决方案1】:

来自man csh,强调我的:

命令替换

命令替换由包含在 ``' 中的命令指示。 该 此类命令的输出在空格处分成单独的单词, 制表符和换行符,空词被丢弃。输出是可变的 能够和命令替换并代替原始字符串。

命令替换在双引号 (`"') 中保留空格和 标签;只有换行符强制新词。单个最终换行符不 在任何情况下都强制一个新词。因此,一个命令子是可能的 即使命令输出一个 整行。

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

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

这与 Bourne shell 不同,后者没有“列表”的概念,变量始终是字符串。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 2014-01-26
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多