[英]tcsh script - Will not output simple ls -l command using cygwin
我想检查目录A中的文件是否与目录B中的文件匹配,并且这些匹配的文件没有被修改/更改。
我对Windows十分熟悉,因此对这种新的编程环境非常陌生。 该任务是学校项目的一部分,但我试图使用cygwin和bash(?)在Windows上运行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”。
您可能有一个文件或目录,其名称类似于~372
,或者包含该文件或目录作为其名称的一部分。
如果您输入
echo ~372
在shell提示符下,shell将努力扩大~372
用户的主目录与名称372
。 几乎可以肯定没有这样的用户-错误消息。
您的命令:
set listing=`ls -l`
反正不太可能有用。 ls -l
的输出是面向行的,带有对齐的列,将被合并为一行文本,其中多个空格由单个空格代替。 这将是一团糟,很难阅读。 (也许重点是证明这一点。)
您可避免在错误~372
通过增加周围的反引号双引号:
set listing="`ls -l`"
但是现在字符串$listing
包含了麻烦的~372
,如果您尝试echo
它,您将遇到同样的问题。 $listing
将扩展为字符串,并且echo
将尝试扩展其中包含的~372
。
因此,您还需要) to the
echo`命令中添加引号(或:q
后缀) to the
。
这是在系统上使用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
如果您只需要将其打印到终端,那么这就是您所需要的。
#!/usr/bin/env tcsh
echo Hello world
ls -l
如果需要将其另存为数组或其他内容,则将其输出到文本文件然后逐行读取为数组会更容易。 (间距弄乱了我直接去做)。
#!/usr/bin/env tcsh
echo Hello world
ls -l > output.txt
如果这是您需要的内容,请阅读将文本文件作为数组导入的内容。
另外,如果您有选择的话,这在bash中会容易得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.