複数の引用符を持つ Bash エイリアス

複数の引用符を持つ Bash エイリアス

私のワークフローの一部として、私はllalias ll='ls -l')必要なファイルがそこにあることを確認するためにディレクトリに移動し、次にcd私がしなければならないことを行うために同じディレクトリに移動する傾向があります。

!!または、同じ機能を使用できるようにするエイリアス(またはbash関数)を追加したいと思いますsudo !!。つまり、 を入力し、そのディレクトリで処理したいファイルを見つけた場合、仮想エイリアスを実行すると、前のコマンドが変更されるように(または同様のように)入力する必要がありますll /mnt/Disc1/somedir。絶対/相対パスを指定して実行コマンドをseに置き換えると、以前の場所ではなくディレクトリになります。cd !!cd !!llcd/mnt/Disc1/somedir

次のようなこの回答、私は働く版を得ました。

cd "$(echo !-1 | awk '{print $2}')"

ターミナルで実行すると、正確に私が望むことが行われます(echo !-1履歴の最後のコマンドを印刷します。つまり、ll /mnt/Disc1/somedirパイピングawk '{print $2}'後に2番目の列を印刷します。つまり/mnt/Disc1/somedir、これはコマンドのパラメータ/パラメータになりますcd)。

私の問題は、このコマンドのエイリアスを定義することです。

機能

私が見たほとんどの答えは、関数をソリューションとして使用することを示唆しています(たとえば、ここ)、しかしこの回答、機能セクションの後に使用することをお勧めします文字通りの引用。しばらく私はこれが私の問題を解決すると思いましたが、うまくいくことはできません。関数の主な問題は、!-1関数への引数としてパスを明示的に入力しなくても、その部分がどのように機能するかを見つけることができないことです。

引用脱出

読んだことの中から(主にこれそしてこれ)、私は引用符をエスケープする正しい方法を理解できれば、私が望むエイリアスの動作バージョンを持つことができると思います。私が見つけた答えの問題は、引用符(または特殊記号)をエスケープする正しい方法を説明せず、これを行う方法を学ぶための良い参考資料も示さないことです(このように多くの例を提供しましたが、正しい方法を学ぶのに十分な説明がありませんでした。)。彼らは、当面の状況に合わせて働くこと、または私が私の状況に適応できないことの例を示しています。

{print $2}代わりに(awkの代わりに)cutコマンドを使用して、その部分の周りの一重引用符を見てみました。しかし、想像できるように、別の区切り文字を定義するには引用符を使用する必要があります。

編集する 指摘したとおりこの回答では、私はこの問題を間違った方法で解決しようとしています。考えられる解決策については@frabjousアノテーションを参照してください。

ベストアンサー1

これと共に - 前のコマンドの最後のパラメータが!!あります。!$

ll /some/dir
cd !$

バラより9.3 歴史的拡張マニュアルに


エイリアスとして使用します。リンクされたマニュアルセクションには次のように記載されています。

行全体を読み取った直後に、シェルがそれを単語に分割する前に履歴拡張を実行します。

その後、エイリアスは次の説明に従って置き換えられます。3.1.1 シェル動作

  1. 引用符で説明されている引用規則に従って、入力を単語と演算子に分割します。これらのタグはメタ文字で区切られます。このステップでは、Aliasの拡張が行われます(Aliasesを参照)。

上記のステートメントを考えると、エイリアスで記録を拡張できるかどうかはわかりません。関数は必要なすべての柔軟性を提供します。

lcd() {
    local ans
    ll "$1"
    read -rp "cd there? [Y/n] " ans
    if [[ ${ans,,} != n* ]]; then
        cd "$1"
    fi
}

機能のユーザーインターフェイスを好みに合わせて調整してください。

おすすめ記事