tcsh script - 不会使用cygwin输出简单的ls -l命令

时间:2014-09-19 04:15:25

标签: linux bash shell cygwin tcsh

我想检查目录A中的文件是否与目录B中的文件匹配,并且不会修改/更改这些匹配的文件。

我对这个新的编程环境很陌生,因为我习惯使用Windows。这个任务是学校项目的一部分,但我试图在我的Windows上使用cygwin和bash(?)运行tcsh脚本。但是,我在脚本中指定了tcsh环境。

这个简单的脚本:

#!/usr/bin/tcsh
echo Hello world;

set listing=`ls -l`

echo $listing

给我以下输出:

Shawn@Shawn-PC /cygdrive/c/Users/Shawn/Desktop
$ ./lab3.sh
Hello world
Unknown user: $372.

然而,我能够运行" ls -l"直接命令进入命令行并返回相应的结果,所以我不知道它为什么不能执行我的" ls -l"脚本中的命令。我不知道脚本中的tcsh语法是否有问题,以及为什么它会返回错误消息"未知用户:#372。"

2 个答案:

答案 0 :(得分:1)

您可能有一个文件或目录,其名称类似于~372,或者包含该名称的一部分。

如果您输入

echo ~372

在shell提示符下,shell将尝试将~372扩展到名为372的用户的主目录。几乎可以肯定,没有这样的用户 - 因此错误信息。

你的命令:

set listing=`ls -l`

无论如何都不太可能有用。 ls -l的输出(使用对齐列的行方向)将连接成一行文本,其中多个空格由单个空格替换。这将是一个混乱,难以阅读。 (或许重点是证明这一点。)

您可以通过在反引号周围添加双引号来避免~372上的错误:

set listing="`ls -l`"

但是现在字符串$listing包含了麻烦的~372,如果你尝试echo它就会遇到同样的问题; $listing会扩展为字符串,echo会尝试展开其中包含的~372

因此 还需要添加引号(或:q后缀) to the echo`命令。

以下是我在系统中使用tcsh的内容:

% touch foo bar '~372'
% ls -l
total 0
-rw-r--r-- 1 kst kst 0 Sep 19 14:06 bar
-rw-r--r-- 1 kst kst 0 Sep 19 14:06 foo
-rw-r--r-- 1 kst kst 0 Sep 19 14:06 ~372
% set listing = `ls -l`
Unknown user: 372.
% set listing = "`ls -l`"
% echo $listing
Unknown user: 372.
% echo "$listing"
total 0 -rw-r--r-- 1 kst kst 0 Sep 19 14:06 bar -rw-r--r-- 1 kst kst 0 Sep 19 14:06 foo -rw-r--r-- 1 kst kst 0 Sep 19 14:06 ~372
%

这不是一件特别有用的事情,但这是怎么做的。

请注意,如果您使用的是bash,那么:

listing="`ls -l`"
echo "$listing"

会保留多行格式。

强制性链接:http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot

答案 1 :(得分:0)

如果您只是需要它打印到终端,那么这就是您所需要的。

#!/usr/bin/env tcsh

echo Hello world

ls -l

如果你需要将它保存为数组或其他东西,将它更容易输出到文本文件然后逐行读取它作为数组。 (间距让我直接搞砸了。)

#!/usr/bin/env tcsh

echo Hello world

ls -l > output.txt

如果这是您所需要的,请阅读将文本文件导入为数组。

此外,如果您有选择,这在bash中会更容易。