获取脚本来更改密码,忽略命令末尾的管道?

获取脚本来更改密码,忽略命令末尾的管道?

我编写了一个小脚本,可以让我更改到路径上脚本的目录,这可以帮助我快速访问我想要编辑的其他脚本,与原始脚本位于同一文件夹中。

我倾向于通过回顾历史并为该命令添加前缀来做到这一点,无论它是什么,就像这样

$ . 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

相关内容