代替項目を持つエイリアスの表示

代替項目を持つエイリアスの表示

エイリアスを表示する方法はありますか?後ろにバッシュが交換されましたか?

背景:
ディレクトリでタスクを実行する長いエイリアスがあります。

alias do_it='cd my_working_dir; do_stuff'

これはうまく機能しますが、エイリアスは非常に長く、頻繁にmy_working_dir変更されます。すべての項目を見つけるためにエイリアスを詳細に検索するのではなく、my_working_dir次のように変更しました。

MY_WORKING_DIR=some_dir
alias do_it='cd ${MY_WORKING_DIR}; do_stuff'

これは素晴らしい作品です。

しかし、時には別名を即座に少し変更したい場合があります。以前のエイリアス構成では、と入力し、alias必要なコマンドをコピー/貼り付け、モードを作成して実行できました。この代替項目を使用して入力すると、次のような結果がalias得られます。

do_it='cd ${MY_WORKING_DIR}; do_stuff'

これで手動で交換する必要がありますMY_WORKING_DIR。エイリアスのコピーを取得する便利な方法はありますか?後ろにbashが置き換えられました(この場合${MY_WORKING_DIR}

言う:私の目標は、エイリアス/関数の入力を変更することではありません。生成されたエイリアス/関数を表示したいです。すでに交換済みこれにより、その出力をコピー/貼り付けて、より複雑なコマンドを作成できます。置き換えられたエイリアスまたは関数を表示する方法が見つかりませんでした。

追加の例

TARGET_DIR='my_dir'    
alias do_it='cd ${TARGET_DIR}; run task; echo "Task done in ${TARGET_DIR}'
alias
do_it='cd ${TARGET_DIR}; run task; echo "Task done in ${TARGET_DIR}'

別名を 50x 繰り返すには、別名出力をコピーして次の行に貼り付けます。

for i in {1..50}; do <paste_here>; done

aliasただし、出力結果$ {TARGET_DIR}が確認されないため、これは機能しません。

エイリアスの代わりに関数を使用することも機能しません。declare${TARGET_DIR}も変更できないからです。

これは単純化された例です。私が使った実際のエイリアスは長くて退屈でした。 ${TARGET_DIR}が複数回出現したため、エイリアス/関数はうまく機能しましたが、エイリアス出力をより複雑な即時コマンドに結合するには、${を手動で置き換える必要がありました。 TARGET_DIR} を複数回実行しました。

ベストアンサー1

私が知っている限り、少なくとも安全で普遍的な方法ではありません。これも私にエイリアスを使う非常に奇妙な方法のようです。

シェルスクリプトがより適切ではないと確信していますか?物を着用して$PATH$PATH必要に応じて調整可能)、名前をdo_it指定するにはパラメータが必要な場合があります。

また、スクリプトにエイリアスと同じ操作を実行させ、要求に応じて別のエントリとともにエイリアスコマンドを表示することもできます。


\必要以上に拡張したり、エスケープ文字を誤って処理するなどのリスクがあるため、エイリアスの使用に固執する場合はこれは非常に安全ではありませんが、次のようにすることができます。

$ alias test='echo $UID'
$ alias xalias='f(){ eval echo $(echo $(alias "$@" | sed s,\'\'',\'\\\\\\\\\\\\\'',g ) ) ; unset -f f; }; f'
$ xalias test
alias test='echo 1000'

正しい見積もりを得ることは残念なことになるかもしれません。これは、単一引用符('->)を引用してから、\'すべてを再引用することによって行われます。最初のeval呼び出しはレベルを逆参照し、この時点で${VAR}レベルは参照されなくなったため評価されます。その後、echo文字列はサブシェルで評価されるため、バックティックを追加します。おそらく間接的な量のため、これを少し複雑にしています。

これはまだ脆弱で、bash + sedはその操作には適していません。

おすすめ記事