我有以下脚本,该脚本在命令上执行“ which -a”,然后执行“ ls -l”,让我知道它是否是链接..即“ grep”,因为我安装了gnu命令(Mac使用iTerm)。
#!/usr/bin/env bash
which -a $1 | xargs -I{} ls -l "{}" \
| awk '{for (i = 1; i < 9; i++) $i = ""; sub(/^ */, ""); print}'
当我从脚本“ test grep”运行它时,我没有收到任何输出,但是当我通过“ bash -x test grep”运行它时,我收到了以下信息:
bash -x test grep
+ which -a grep
+ xargs '-I{}' ls -l '{}'
+ awk '{for (i = 1; i < 9; i++) $i = ""; sub(/^ */, ""); print}'
/usr/local/bin/grep -> ../Cellar/grep/3.1/bin/grep
/usr/bin/grep
最后两行是我要显示的内容。认为这样做会更容易;-) ..我还尝试附加管道,认为printf将解决此问题:
| while read path
do
printf "%s\n" "$path"
done
感谢和..有没有更好的方法来获取我需要的东西?
答案 0 :(得分:1)
问题是您将脚本命名为test
。
如果您要运行PATH
中没有的命令,则需要指定它所在的目录,例如./test
。
尝试运行test
不会出错,因为有一个内置的名为test
的bash命令被使用。为了进一步避免混淆,标准test
不产生任何输出。
结论:
./
在当前目录中运行脚本。test
。答案 1 :(得分:1)
感谢从未命名脚本“测试” ..旧习惯很难打破(我来自非unix背景。
我以以下内容结束
for i in $(which -a $1)
do
stat $i | awk NR==1{'$1 = ""; sub(/^ */, ""); print}'
done
或更简单
for i in $(which -a $1)
do
stat -c %N "$i"
done
答案 2 :(得分:1)
考虑以下shell函数:
cmdsrc() {
local cmd_file cmd_file_realpath
case $(type -t -- "$1") in
file) cmd_file=$(type -P -- "$1")
if [[ -L "$cmd_file" ]]; then
echo "$cmd_file is a symlink" >&2
elif [[ -f "$cmd_file" ]]; then
echo "$cmd_file is a regular file" >&2
else
echo "$cmd_file is not a symlink or a regular file" >&2
fi
cmd_file_realpath=$(readlink -- "$cmd_file") || return
if [[ $cmd_file_realpath != "$cmd_file" ]]; then
echo "...the real location of the executable is $cmd_file_realpath" >&2
fi
;;
*) echo "$1 is not a file at all: $(type -- "$1")" >&2 ;;
esac
}
...如此使用:
$ cmdsrc apt
/usr/bin/apt is a symlink
...the real location of the executable is /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/apt
$ cmdsrc ls
/bin/ls is a regular file
$ cmdsrc alias
alias is not a file at all: alias is a shell builtin
答案 3 :(得分:0)
提出一些建议,并提出以下建议: prt下划线只是一个精美的printf函数。我决定不使用readline,因为最终命令解析可能对我来说并不陌生,而且我只处理常规文件..因此无法处理所有情况,但最终却提供了我一直在寻找的输出。感谢您的所有帮助。
llt ()
{
case $(type -t -- "$1") in
function)
prt-underline "Function";
declare -f "$1"
;;
alias)
prt-underline "Alias";
alias "$1" | awk '{sub(/^alias /, ""); print}'
;;
keyword)
prt-underline "Reserved Keyword"
;;
builtin)
prt-underline "Builtin Command"
;;
*)
;;
esac;
which "$1" &> /dev/null;
if [[ $? = 0 ]]; then
prt-underline "File";
for i in $(which -a $1);
do
stat "$i" | awk 'NR==1{sub(/^ File: /, ""); print}';
done;
fi
}