回答:
バッシュのドキュメントの状態「ほぼすべての目的のためには、シェル関数は、エイリアスよりも優先されます。」以下は、引数が(のみ)で構成されls
ているmore
場合に出力を置き換えてパイプするシェル関数です-la
。
ls() {
if [[ $@ == "-la" ]]; then
command ls -la | more
else
command ls "$@"
fi
}
ワンライナーとして:
ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }
自動的にパイプ出力:
ls -la
command
関数が再帰的に呼び出されるのを防ぎます。
以下からのエイリアスのmanページ:
各単純コマンドの最初の単語は、引用符で囲まれていない場合、エイリアスがあるかどうかが確認されます。その場合、その単語はエイリアスのテキストに置き換えられます。エイリアス名と置換テキストには、シェルメタキャラクターを含む有効なシェル入力を含めることができますが、エイリアス名に「=」を含めることはできません。
そのため、エイリアスの一致について最初の単語のみがチェックされるため、複数単語のエイリアスが不可能になります。引数をチェックし、一致する場合はコマンドを呼び出し、それ以外の場合は通常のコマンドを呼び出すシェルスクリプトを作成できる場合がありますls
(@Dennis Williamsonの回答を参照)
デニスの回答から取られたわずかに改善されたアプローチ:
function ls() {
case $* in
-la* ) shift 1; command ls -la "$@" | more ;;
* ) command ls "$@" ;;
esac
}
またはワンライナー:
function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }
これにより、必要に応じてコマンドの後にオプション/引数を追加できます。たとえば、 ls -la -h
ls -lat
この治療から除外したい場合、これはどのように処理されますか?-la*
エントリの上にそれを処理するケースを置く必要がありますか?
このエイリアスは引き続き呼び出すことができますが、スペースがコマンドワードの一部であるためには引用が必要です。そのため、オプションをに"ls -la" -p pattern
渡し-p pattern
ます。more
ls
alias lsm='ls -la | more'