web-dev-qa-db-ja.com

Bash:別名の中のスペース

私はbashでエイリアスを作成しようとしています。私がやりたいことはls -lals -la | moreにマップすることです

私の.bashrcファイルでこれは私が試みたものです:

alias 'ls -la'='ls -la | more'

ただし、エイリアス名にスペースが含まれているため(これは想定しています)、機能しません。これに対する回避策はありますか?

112

Bashのドキュメント には、「ほとんどすべての目的で、シェル関数がエイリアスよりも優先されます」と記載されています。これはlsを置き換え、引数が(のみ)-laで構成されている場合に出力をmoreにパイプ処理するShell関数です。

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
120

エイリアスのmanページ から:

引用符が付いていない場合、各単純コマンドの最初のWordは、それが別名を持っているかどうかを確認するためにチェックされます。もしそうなら、そのWordは別名のテキストに置き換えられます。別名と置換テキストには、シェルのメタ文字を含む、有効なシェル入力を含めることができます。ただし、別名には「=」を含めることはできません。

したがって、最初のWordだけがエイリアスの一致についてチェックされ、複数Wordのエイリアスは不可能になります。引数をチェックし、一致する場合はコマンドを呼び出し、それ以外の場合は通常のlsを呼び出すシェルスクリプトを作成することができます( @ Dennis Williamsonの答えを参照してください

49
heavyd

デニスの答えから取られたわずかに改善されたアプローチ:

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

14
ld_pvl