用ls和变量在bash中awk

时间:2014-12-18 20:24:23

标签: bash awk ls

我只想打印特定目录的文件名: 这样就可以了:

ls -g  --sort=size -r /bin | awk '{print $8,$9,$10,$11,$12,$13}'

但如果我读了路径变量,它就不起作用了:

read PATH
ls -g  --sort=size -r $(PATH) | awk '{print $8,$9,$10,$11,$12,$13}'
Command 'awk' is available in '/usr/bin/awk'

2 个答案:

答案 0 :(得分:4)

应该是:

ls -g  --sort=size -r ${PATH} | awk '{print $8,$9,$10,$11,$12,$13}'

注意花括号。

使用$(..),它将执行名为PATH的命令/函数并替换结果,这不是您想要的。

请注意,PATH是变量名称的不良选择,因为它将覆盖具有相同名称的系统变量并使系统命令不可用(因为原始PATH现在已经消失)。我建议您使用其他名称,例如my_path

read my_path
ls -g  --sort=size -r ${my_path} | awk '{print $8,$9,$10,$11,$12,$13}'

答案 1 :(得分:3)

这正是您不应该使用UPPER_CASE_VARS的原因。 $ PATH是variable used by the shell,用于查找系统上的可执行文件。只要您使用用户输入覆盖它,您的脚本就无法再找到任何输入中没有的内容。在这种情况下,您输入了/bin,因此您的脚本可以找到/bin/ls,但awk不存在。

command_not_found_handle(请参阅/etc/bash.bashrc)介入给你一个建议。