所以我在$ dir中给了一个目录,在$ 1中给了一个Unix命令我需要检查$ dir目录中有多少个文件可以执行$ 1 Unix命令。
for dir in `echo $PATH|tr : '\n'`
do
for file in `find $dir -type f`
do
#Here I would like to check if the command works on the file
then
echo " $1 $dir/$file works"
else
echo " $1 $dir/$file doesn't work"
fi
done
done
答案 0 :(得分:1)
您似乎想要搜索PATH
中的所有文件,并且对于每个文件,查看命令$1
是否成功或以该文件作为参数失败。在那种情况下:
#!/bin/bash
(IFS=:
find $PATH -type f -exec bash -c 'if "$1" "$2"; then echo "$1 $2 works"; else echo "$1 $2 fails"; fi' None "$1" {} \;
)
或者,为了提高效率:
(IFS=:
find $PATH -type f -exec bash -c 'cmd=$1; shift; for f in "$@"; do if "$cmd" "$f"; then echo "$cmd $f works"; else echo "$cmd $f fails"; fi; done' None "$1" {} +
)
(
这会启动一个子shell。这样做是为了使IFS
在子shell完成后返回其原始值。
IFS=:
这告诉shell在:
上进行单词拆分。
find $PATH -type f -exec bash -c '...' None "$1" {} +
这将查找PATH
目录下的所有常规文件,并在'...'
上执行命令。
更具体地说,'...'
中的命令是作为位置参数给出的,命令$1
的名称以及一个或多个(可能很多)文件作为参数进行测试。
'...'
中的命令是:
cmd=$1
shift
for f in "$@"; do
if "$cmd" "$f"
then echo "$cmd $f works"
else echo "$cmd $f fails"
fi
done
这些命令测试命令是否成功并报告结果。
)
这将关闭子shell
正如格伦杰克曼建议的那样,您可能不希望看到命令$1
的每次运行的输出,而只是跟踪它是成功还是失败。在这种情况下,我们可以将命令的输出重定向到/dev/null
,如下所示:
#!/bin/bash
(IFS=:; find $PATH -type f -exec bash -c 'if "$1" "$2" >/dev/null 2>&1; then echo "$1 $2 works"; else echo "$1 $2 fails"; fi' None "$1" {} \; )
完成后,输出可能如下所示:
$ bash scriptname ls
ls /bin/keyctl works
ls /bin/mt-gnu works
ls /bin/uncompress works
ls /bin/nano works
ls /bin/zless works
ls /bin/run-parts works
[...snip...]