bash:进程替换,粘贴和回显

时间:2013-10-28 18:46:44

标签: bash unix stdout

我正在尝试流程替换,这只是一个有趣的练习。

我想将字符串“XXX”附加到'ls'的所有值:

paste -d ' ' <(ls -1) <(echo "XXX")

为什么这不起作用? XXX未附加。但是,如果我想将文件名附加到自身,例如

paste -d ' ' <(ls -1) <(ls -1)

它有效。

我不明白这种行为。 echo和ls -1都写入stdout,但不会通过paste读取echo的输出。

6 个答案:

答案 0 :(得分:4)

尝试这样做,使用printf黑客来显示长度为零的文件并附加XXX。

paste -d ' ' <(ls -1) <(printf "%.0sXXX\n" *  )

演示:

$ ls -1
filename1
filename10
filename2
filename3
filename4
filename5
filename6
filename7
filename8
filename9

输出:

filename1 XXX
filename10 XXX
filename2 XXX
filename3 XXX
filename4 XXX
filename5 XXX
filename6 XXX
filename7 XXX
filename8 XXX
filename9 XXX

如果你只想附加XXX,这个会更简单:

printf "%sXXX\n" 

答案 1 :(得分:1)

如果你想在XXX输出的每一行之后ls -l,你需要第二个输出x乘以字符串的命令。您只回显一次,因此它将仅附加到ls输出的第一行。

如果您要搜索一个小命令行来完成任务,可以使用sed

ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'

答案 2 :(得分:1)

这是一个有趣的,除了传说中的yes命令外没有使用任何外部命令!

while read -u 4 head && read -u 5 tail ; do echo "$head $tail"; done 4< <(ls -1) 5< <(yes XXX)

(我只是张贴这个,因为它很有趣,实际上它不是100%的主题,因为它使用文件描述符和进程替换)

答案 3 :(得分:1)

  

......你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done

永远不要使用for i in $(command)。有关详细信息,请参阅this answer

所以,回答这个原始问题,你可以简单地使用这样的东西:

for file in *; do echo "$file XXXX"; done

awk的另一个解决方案:

ls -1|awk '{print $0" XXXX"}'
awk '{print $0" XXXX"}' <(ls -1) # with process substitution

sed的另一个解决方案:

ls -1|sed "s/\(.*\)/\1 XXXX/g"
sed "s/\(.*\)/\1 XXXX/g" <(ls -1) # with process substitution

无用的解决方案,只是为了好玩:

while read; do echo "$REPLY XXXX"; done <<< "$(ls -1)"
ls -1|while read; do echo "$REPLY XXXX"; done

答案 4 :(得分:0)

它只对第一行执行,因为它将参数1中的第一行与参数2中的第一行分组:

paste -d ' ' <(ls -1) <(echo "XXX")

......输出:

/dir/file-a XXXX
/dir/file-b
/dir/file-c

......你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done

答案 5 :(得分:0)

您可以使用xargs获得相同的效果:

ls -1 | xargs -I{} echo {} XXX