Ksh ls -1没有按预期工作

时间:2015-08-14 20:39:29

标签: ksh ls

对于命令ls,选项-1应该运行ls,产生只有一列的输出(每行产生一个文件)。但是如果我把它放在一个脚本中,它只会显示每行被卡住的文件,用空格隔开。

脚本:

#!/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

2 个答案:

答案 0 :(得分:3)

它只显示卡在一行上的每个文件,用空格分隔。

你必须考虑是什么。

当你这样做时

text=`ls -1`

运行程序ls并显示输出,就像输入它一样。所以shell会显示:

ls=file1
file2
file3
etc.

shell在空格上拆分命令行标记,默认情况下包括空格,制表符和换行符。因此,每个文件名都被shell视为一个单独的标记。

然后将这些标记作为单独的参数传递给echoecho命令不知道换行符在那里。

我相信你知道,所有echo都是将每个参数写入stdout,每个参数之间都有一个空格。

这就是@ user5228826给出的建议有效的原因。如果您不想使用换行符来分隔令牌,请更改IFS

但是,您真正需要做的就是将变量括在引号中,以便它不会被拆分:

echo "$text"

顺便说一句,使用`backticks`是不推荐使用的,因为它很难阅读,特别是在嵌套时。如果您在脚本上运行ksh -n,它会向您报告(假设您没有使用古老版本)。使用:

text=$(ls -1)

说了这么多,这是一个获取文件列表的可怕方法。 UNIX shell执行通配,这是对ls外部程序的不必要使用。尝试:

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

答案 1 :(得分:-1)

那是因为你将ls输出捕获到变量中。 Bash也是如此。