2015-08-14 96 views
-1

對於命令ls,選項-1應該運行ls產生只有一列的輸出(每行產生一個文件)。但是如果我把它放在一個腳本中,它只會顯示一行中卡住的每個文件,並用空格分隔。Ksh ls -1沒有按預期工作

腳本:

#!/bin/ksh 

text=`ls -1` 
echo $text 

文件夾內容:

test 
    |--bob 
    |--coolDir 
    |--file 
    |--notThisDirectoryAgain 
    |--script.sh 
    |--spaces are cool 
    |--thatFile 

腳本輸出:

bob coolDir file notThisDirectoryAgain script.sh spaces are cool thatFile 

輸出,如果我在終端(未在腳本中)運行ls -1

bob 
coolDir 
file 
notThisDirectoryAgain 
script.sh 
spaces are cool 
thatFile 
+1

嘗試'echo「$ text」'。祝你好運。 – shellter

回答

3

它只是顯示在一行中卡住的每個文件,用空格分隔。

你必須考慮它是什麼是。

當你

text=`ls -1` 

運行程序ls,並提出了輸出,如果你在鍵入它因此,外殼被呈現。

ls=file1 
file2 
file3 
etc. 

殼分裂命令行空白符號,默認情況下包含空格,製表符和換行符。所以每個文件名都被shell看作是一個單獨的標記。

然後這些令牌作爲單獨的參數傳遞到echoecho命令不知道換行符在那裏。

正如我確信你知道的,所有echo確實是將每個參數寫入標準輸出,每個參數之間有一個空格。

這就是爲什麼@ user5228826給出的建議有效。如果您不希望換行符分隔令牌,請更改IFS

但是,你真正需要做的是用引號括起來的變量,因此,它沒有得到拆分:

echo "$text" 

順便說一句,使用`一段單列已被棄用,不良做法,因爲可能難以閱讀,特別是在嵌套時。如果您在腳本上運行ksh -n,它會向您報告(假設您未使用古老版本)。使用:

text=$(ls -1) 

說了這麼多,這是一個可怕的方式來獲取文件列表。 UNIX shell可以進行通配,這是對外部程序不必要的使用。試試:

text=(*)    # Get all the files in current directory into an array 
oldIFS="$IFS"  # Save the current value of IFS 
IFS=$'\n'   # Set IFS to a newline 
echo "${text[*]}" # Join the elements of the array by newlines, and display 
IFS="$oldIFS"  # Reset IFS to previous value 
+0

而不是使用額外的'oldIFS'變量,你也可以運行這個子shell:'(IFS = $'\ n'; echo「$ {text [*]}」)' –

+0

好的答案。也許在非交互式使用中添加一行來說'ls'甚至不需要'-1'? –

-1

這是因爲你將ls輸出捕獲到變量中。 Bash也是這樣。

+0

所以變量不允許有換行符,他們只是將它們轉換爲空格?似乎有點愚蠢的做到這一點。這完全不直觀。 – Aderis

+1

試試這個: #!/ bin/ksh IFS =''text ='ls -1' echo $ text – user5228826

+0

這不是愚蠢的,也不是不直觀的。它只是對你而言,因爲你不知道殼是如何工作的。 UNIX shell從來不是最終用戶工具。 – cdarke