zsh(または他のシェル)でディレクトリ区切りエイリアスを定義できますか?

zsh(または他のシェル)でディレクトリ区切りエイリアスを定義できますか?

現在の作業ディレクトリによって異なるエイリアスを使用したい(または異なる名前を持つ同じエイリアス)。たとえば、lいくつかの追加オプションに省略形を使用したい場合があります。ls2つのバリエーションを使いたいです。

alias l="ls --sort=extension" # variant A
alias l="ls --quoting-style=literal" # variant B

一般的にバリアントAを使いたいです。しかし、画像を一覧表示するときにバリアントBを使用したいと思います。つまり、作業ディレクトリが~/pictures.(これは最小限の例にすぎません。実際のユースケースはより複雑です)。

l()の出力で大文字と小文字を区別する関数を簡単に作成できることがわかります$(pwd)。ただし、エイリアスを変更せずに特定のディレクトリの名前を変更できる、より強力なソリューションが必要です.zshrc。 (そしてこれは問題を引き起こしません。)

しかし、可能ですか?書くまたは次へ追加.zshrcエイリアス(例:vimやlocalと同様に、関連ディレクトリにlocalを設定する.vimrc)?

また、bashや他のシェルでも可能ですか?

答え1

使用する場合ああ、、ただアクティブにするdotenv入れる:

plugins+=(dotenv)
ZSH_DOTENV_FILE=.any-name-you-like-for-the-per-directory-alias-file

また考慮ディレンフ、各ディレクトリの環境変数をエクスポートできます.envrcそして出発時にキャンセルしてください(不可能dotenv)。 direnvは、広く使用されているすべてのシェルと互換性があります。しかしそうではありませんエイリアスまたは関数を定義できます。

まだ組み合わせることができますIrkachoの方法direnvを使用すると、direnvで設定された1つ以上の環境変数に基づいて実行するアクションを決定する関数(エイリアスではなく)を生成できます。

どちらの方法も、ドットファイルを含むディレクトリを手動でホワイトリストに追加してセキュリティ上の問題を処理します。

答え2

現在のディレクトリ内の特定のファイルを確認し、それに応じて動作を変更する関数またはスクリプトを作成できます。

l() {
    if [ -f ./.ls-literal-quote ] ; then
         ls --quoting-style=literal "$@"
    else
         ls --sort=extension "$@"
    fi
}

この機能を使用すると、集中型の場所ではなくディレクトリ自体に設定を維持できます(必要に応じて)。

これで、関連ディレクトリに追加のファイルを分散させる必要がありますが、次の方法でこの問題を解決できます。拡張属性(あなたのシステムがサポートする場合)

答え3

これを達成するためにプロジェクトを開発しています。確認してください:ローカルエイリアス

これにより、定義されたディレクトリにローカルに擬似エイリアスと関数を作成して使用できます。おそらく最善の点は、危険な「ソース」コマンドを実行せずにこれを行うことです。これらの解決策はより簡単で高速ですが、セキュリティ上の問題は深刻です。

以下はデモです:

ここに画像の説明を入力してください。

答え4

もちろんです。テストを実行する一部のシェルコードでエイリアスを拡張するだけです。

alias l="[[ $PWD =~ /pictures$ ]] && ls --quoting-style=literal || ls --sort=extension"

関連情報