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

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

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

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

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はその操作には適していません。

答え2

時には作業ディレクトリを変更したいと思うので、ディレクトリパス名をコマンドライン引数として使用できるシェル関数にエイリアスを変更することをお勧めします。

do_it () {
    local wd="${1:-my_working_dir}"
    cd "$wd" || return
    do_stuff
 }

この関数はオプションの単一パラメータであるディレクトリパス名を使用します。与えられると、関数のローカルwd変数がこの値に設定されます。指定しないと、ローカルwd変数は静的文字列に設定されますmy_working_dir

わずかに変更すると、ユーザーが予期しない作業ディレクトリにあるのを防ぐ機能を無効にできます。

do_it () {
    local wd="${1:-my_working_dir}"
    (
        cd "$wd" || return
        do_stuff
    )
 }

cd関数内で括弧で囲まれたサブシェル環境(変更可能な現在の作業ディレクトリを含む)は、呼び出しシェルの環境には影響しません。

通常、エイリアスを宣言する場所でこの関数を宣言し、次のように使用できます。

do_it

それとも論争がありますね。

do_it some/directory/path

または、複数のディレクトリパス名で実行されるループで

for target_dir in some/pattern/dir*/
do
    do_it "$target_dir"
done

答え3

以下は次のコピーです。

Bashでエイリアスをインラインに拡張するには?

そして

実行前にサブシェルを拡張しますか?

BASHはこの問題を処理するためにreadlineを使用することがわかりました。それから押してくださいEsc-Ctrle

テストのために、.bash_profileに次のエイリアスを定義しました。

alias cdh='cd ${HOME}'

新しいシェル/ターミナルを起動すると、次のように入力できます。

cdh

次に[次へ]をクリックします。 Esc Ctrl-e

readlineはコマンドラインを次のように更新します。

cd /home/user_name 

MacOS 13.2.1
iterm2 3.4.15
bash 5.1.8(1)-リリース(x86_64-apple-darwin21.2.0)

Ubuntu 20.04.5 LTS
5.0.17(1)-リリース(x86_64-pc-linux-gnu)

関連情報