2014-09-19 49 views
1

我想检查目录A中的文件是否与目录B中的文件匹配,并且这些匹配的文件没有被修改/更改。tcsh脚本 - 不会使用cygwin输出简单的ls -l命令

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

这个简单的脚本:

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

set listing=`ls -l` 

echo $listing 

给我下面的输出:

[email protected] /cygdrive/c/Users/Shawn/Desktop 
$ ./lab3.sh 
Hello world 
Unknown user: $372. 

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

+2

Tcsh是用于编写脚本一个非常贫穷的壳,你必须这样做,这条路? – Barmar 2014-09-19 04:18:22

+1

如果引用变量'echo“$ listing”'',它会更好吗? – Barmar 2014-09-19 04:18:51

+0

不幸的是,这是我们需要用于分配的开发工具。不,我得到完全相同的输出,当我使用echo“$ listing” – 2014-09-19 05:06:40

回答

1

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

如果你在shell提示下键入

echo ~372 

,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

0

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

#!/usr/bin/env tcsh 

echo Hello world 

ls -l 

如果您需要将其保存为一个数组或东西会更容易把它输出到一个文本文件,然后用线阵列,行读它。 (这个间距让我无法直接做到)。

#!/usr/bin/env tcsh 

echo Hello world 

ls -l > output.txt 

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

另外,如果你有选择,这将在bash中更容易。