使用 dmenu 访问 shell 别名

使用 dmenu 访问 shell 别名

我有一组 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

来源

相关内容