我编写了一个小脚本,可以让我更改到路径上脚本的目录,这可以帮助我快速访问我想要编辑的其他脚本,与原始脚本位于同一文件夹中。
我倾向于通过回顾历史并为该命令添加前缀来做到这一点,无论它是什么,就像这样
$ . cdbin my_super_script
这在大多数情况下都有效 - 但是 - 当我运行的最后一个命令通过管道传送到某处时它不起作用,
例如
# if my last command was the following
$ my_super_script | grep -v bad | grep good
# then when I try and run my cdbin script using history, it looks like this
$ . cdbin my_super_script | grep -v bad | grep good
然后这什么也没做 - 没有错误,它只是将我留在当前目录中。
这是我的简单cdbin
脚本:
cdbin
PROG=$(which "$1")
DIR=$(dirname "$PROG")
cd "$DIR"
编辑:请注意,我知道大多数时候我可以简单地输入类似以下内容来避免这种情况,例如,$ . cdbin !:0
但发现输入有点尴尬:D
答案1
当您使用管道运行此程序时,您的. cdbin
命令在子 shell 中运行:因此它会更改子shell中的目录,并且当子shell关闭时效果会丢失。
为了避免这种情况,因为您只对命令您之前运行过,请使用历史记录:
. cdbin !!:0
这会提取上一个命令的第一个单词,所以在你的场景中你最终会得到
. cdbin my_super_script
您可以使用fc
以下命令来提取之前的命令:
. cdbin $(fc -l -1 | awk '{print $2}')
可以将其转换为别名以使其更易于使用,或者使其成为cdbin
自身的一部分,例如,如果不带任何参数调用它:
CMD=${1:-$(fc -l -1 | awk '{print $2}')}
PROG=$(which "$CMD")
DIR=$(dirname "$PROG")
cd "$DIR"
unset CMD PROG DIR