エイリアスの末尾にスペースを付けるハックをパラメータを指定して機能させる方法

エイリアスの末尾にスペースを付けるハックをパラメータを指定して機能させる方法

watchExpandとという2 つのエイリアスがありますl。次のように末尾にスペースを置くことで、エイリアスで bash 拡張を機能させることができることはわかっています。

alias watchExpand='watch '

lは にエイリアスされていますls -larthiF --context。そのため、コマンドを入力すると、watchExpand lうまく機能します。

しかし、コマンドにパラメータを指定するとwatchExpand、例えば

watchExpand -n 1 l

エイリアスlが機能しなくなりました。引数の後に bash 拡張を取得するにはどうすればよいでしょうか?

答え1

これは私が考えた悪いアイデアです考えるあなたが求めているのは:

function watchExpand() {
  e=""
  for param in $@
  do
    if alias $param >/dev/null 2>&1
    then
      exp=$(alias $param | cut -d= -f2| sed -e s/^\'// -e s/\'\$//)
      e+=" $exp"
    else
      e+=" $param"
    fi
  done
  watch $e
}

答え2

Zsh にはグローバル エイリアスがあります。次のように実行できます。

alias -g @l='ls -larthiF --context'

その後:

watch -n 1 @l

これは@必須ではありませんが、グローバル エイリアスが意図せず呼び出されるのを避けるために使用します。

答え3

私は自分のやり方で解決策を見つけ出します。

まず、必要に応じてエイリアス/関数を簡単に追加できるように、「addExpand」という関数を作成します。

xb@dnxb:/tmp/t$ type -a addExpand
addExpand is a function
addExpand () 
{ 
    echo -e "#!/bin/bash\nshopt -s expand_aliases\n. ~/.bash_aliases 2>/dev/null\n$1"' "$@"' | sudo tee /usr/bin/e_"$1";
    sudo chmod +x /usr/bin/e_"$1"
}
xb@dnxb:/tmp/t$ addExpand l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"

を実行するとaddExpand l、エイリアスがl実行可能ファイルとして作成されます。バイナリ以下の内容が含まれます:

xb@dnxb:/tmp/t$ cat /usr/bin/e_l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"

エイリアス/関数の拡張バージョンをぜひご利用ください:

xb@dnxb:/tmp/t$ watch --color -n 1 e_l /tmp //works like a charm !!!
xb@dnxb:/tmp/t$ 

注記:

[1] e_l、コマンドの拡張バージョンであることを示すために「e_」を接頭辞として付けます。

[2] で実行すると、毎秒ソースを実行するのは重すぎるように感じますwatch -n 1。この問題を解決する方法を見つける必要があるかもしれません。

[3] もう一つの欠点は、エイリアスを再帰的に解決しないことです。

関連情報