2014-09-19 69 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中更容易。