Space Hackを使用して提供された引数でエイリアス後続操作を実行する方法

Space Hackを使用して提供された引数でエイリアス後続操作を実行する方法

watchExpand2つのエイリアスがありますl。次のように、後ろにスペースを入れることで、bash拡張がエイリアスで機能するようにできることを知っています。

alias watchExpand='watch '

lエイリアスはls -larthiF --context.so です。コマンドを入力すると、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次のような実行可能ファイルで生成されます。/usr/bin/e_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]ランを使用すると、1秒間に1つの購入をするには重すぎると感じますwatch -n 1。この問題を解決する方法を見つける必要があります。

[3] 別の欠点は、別名を再帰的に確認できないことです。

関連情報