我有一组 bash 命令(一个衬垫),我定期使用它们来打开新的 shell 或使用一组给定的参数启动程序。当我使用时dmenu
,我希望能够从我的 shell 和dmenu
.因此,alias
在 my 中定义 an.bashrc
是不够的,我必须将这些命令放在一个专用文件中。该文件需要可执行并存储在$PATH
已知的dmenu
.如果我这样做,别名就变得毫无用处,因为 shell 会找到可执行文件。但这意味着我必须为每个命令创建一个文件。它很烦人。
有没有一种方法可以将所有这些命令存储在一个文件中(或者至少以一种更方便的方式),以便可以通过 shell 和 访问它们dmenu
?也许类似于dmenu
...读取的别名文件之类的东西
答案1
如果您将所有别名都放在一个文件中(比方说~/.aliases.sh
),您可以执行以下操作:
#!/bin/bash
. ~/.aliases.sh
alias |
awk -F '[ =]' '{print $2}' |
dmenu |
xargs -ICMD bash -O expand_aliases -c $'. aliases.sh\nCMD'
答案2
您必须编写一个脚本将它们通过管道传输到 dmenu 并执行结果。
这是一个示例脚本
#!/bin/bash
cachedir=${XDG_CACHE_HOME:-"$HOME/.cache"}
if [ -d "$cachedir" ]; then
cache=$cachedir/dmenu_run
else
cache=$HOME/.dmenu_cache # if no xdg dir, fall back to dotfile in ~
fi
if [ -f ~/.bash_aliases ]; then
aliases=( ~/.bash_aliases )
fi
if [ ~/.bash_functions ]; then
functions=( ~/.bash_functions )
fi
source $aliases
cmd=`(
IFS=:
if stest -dqr -n "$cache" $PATH || stest -fqr -n "$cache" "$aliases" || stest -fqr -n "$cache" "$functions"; then
(
stest -flx $PATH
alias | awk -F '[ =]' '{print $2}'
compgen -A function
) | sort -u | tee "$cache" | dmenu "$@"
else
dmenu "$@" < "$cache"
fi
)`
if [ -f ~/.bash_aliases ]; then
if [ ! -z "$(grep '^alias' $aliases|cut -d'=' -f1|grep $cmd)" ] || [ -z $(which $cmd) ]; then
echo -e "source ~/.bash_aliases \n $cmd" | bash -O expand_aliases &
else
exec $cmd &
fi
fi