由于我的问题似乎有点负担,我只是解释我尝试做什么。
我经常使用监禁程序,例如bash
,这使我进入另一个上下文。 (例如vim
等文字编辑器或irb
或python -i
等shell。
在那里我经常闲聊一下,直到我用^Z
让程序进入睡眠状态。那时,我回到了我的正常bash
shell,母舰。
在某些时候我可能想再次打电话给irb
或vim
,但是因为我不知所措,我通常已经忘记了我正在睡觉的那个节目的实例。即使我没有,我的手通常比我的大脑更快地行动起来让我们看看那些jobpec!
现在,我在同一个shell
实例中运行了同一程序的两个实例。现在goto 1
:我会再次^Z
,忘记它,运行另一个实例,等等。
所以当我打电话给vim
:
vim
个实例超过1时,请将其混淆vim
个实例打开时,打开那个vim
的实例打开时,打开一个新的vim!
这是我的计划:
_make_escapable() {
"$1"() {
declare INSTANCES_OF_CMD=$(jobs | grep -c "\S\+Stopped\+\S\+\s\+$1")
case ${INSTANCES_OF_CMD} in
0)
command "$1" "$@"
;;
1)
if [ $# -eq 0 ]; then
%"$1"
return 0
else
echo "Can't open other files with a running instance of $1"'!' 1>&2
fi
;;
*)
echo "You have multiple instances of $1 running. Choose one." 1>&2
;;
esac
}
alias "$1"'!'="command $1"
}
_make_escapable 'vim'
_make_escapable 'irb'
如您所见,我想自动化该功能。问题是函数名称没有参数扩展(似乎)。我可以为每个程序执行一个新功能,但是我有一个很好的界面来执行此操作。 有人知道怎么做吗?
答案 0 :(得分:0)
_make_escapable() {
alias make_function="$1"'() { declare INSTANCES_OF_CMD=$(jobs | grep -c "\S\+\s\+\S\+\s\+'"$1"'") &&
case ${INSTANCES_OF_CMD} in
0) command '"$@"' "$@" ;;
1) if [ $# -eq 0 ]; then %'"$1"'; return 0 ; else echo ''Cannot use parameters with running instance of '"$1"'''; fi ;;
*) echo ''You have multiple instances of '"$1"' running. Choose one.'' 1>&2 ;;
esac; }'
eval make_function
unalias make_function
alias "$1"'!'='command '"$1"
}
_make_escapable 'vim'
_make_escapable 'irb'
_make_escapable 'ghci' '-v0'
这将接受任何命令并使其可以逃跑,就像我在我的问题中描述的那样。
它首先使用别名构造函数定义,然后执行别名,定义函数。