web-dev-qa-db-ja.com

エイリアスコマンドに引数を渡すことはできますか?

Aliasコマンドで引数を渡すことができるかどうかを知りたいです。

例えば:

alias d="dmesg|grep -iw usb|tail -5" 

これで、dは最後の5行を出力します。 dを使用して異なる行数を出力する場合は、dのエイリアスコマンド宣言を再度変更する必要があります。

行数を変更するために宣言を再入力する必要がないように、エイリアスの宣言を変更する方法はありますか。 dのエイリアスを宣言しながら、引数として行数を渡すことを組み込むように?または、これを解決する他の方法はありますか?

17
srk_cb

エイリアスは引数を取りません。 alias foo='bar $1'のようなエイリアスを使用すると、$1は、エイリアスが実行されるときにシェルによってシェルの最初の引数(おそらくは何もない)に展開されます。

そのため:関数を使用、代わりに。

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5}は最初の引数を使用し、指定されていない場合はデフォルト値の5を使用します。

その後、次のことができます。

$ d
# prints 5 lines
$ d 10
# prints 10 lines

または、少し使用したオプションを変更する場合:

alias d="dmesg|grep -iw usb|tail -n 5"

次に、追加の-nオプションを渡すことができます。

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

tailに複数の-nオプションが指定されている場合、最後のオプションのみが使用されます。

20
muru

SO および here で説明されているように、このための関数が必要です。以下を試してください:

foo() { /path/to/command "$@" ;}

fooを次のように呼び出します:

foo arg1 arg2 arg3
5
Ron

Groupコマンドとhere-stringでエイリアスの制限を回避する

エイリアスは引数を取ることができませんが、それを「シミュレート」できます。 この質問 に関する私の答えの例を見てみましょう。

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

ここで起こっているキーポイント:

  • 組み込みのreadを使用して、文字列を変数dに読み取ります。空白文字(改行、タブ、スペース)を含む完全な文字列を読み取りたいため、IFS=を使用し、-rでバックスラッシュエスケープを無効にします。
  • <<<here-string operator を使用すると、mkcdエイリアスの引数として指定した文字列をリダイレクトできます。使用法はmkcd "some directory"になります
  • エイリアス内の複数のコマンドは、{ list; }構造(bashマニュアルではgroup commandとして知られています)を使用して、現在のシェルで結合および実行されます。 {および;の個々のコマンドリストの後に続くスペースが必要なことに注意してください。

具体的な例では、次のことができます。

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

また、スペースで区切られた引数を保存するためにWord分割を利用することもできます。

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

または、配列を使用して複数の引数を提供できます。

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

しかし、これは良いアプローチですか?

必ずしも。このようなアプローチの問題は、非常に具体的であるということです。引数を簡単に引用できないため、スペースなしの引数しか持てません。

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

もちろん、これは広く使用されるものではありません。単純に現実の世界では複雑な議論に対処する必要があるため、このアプローチはあまり実用的ではありません。関数ははるかに柔軟です。また、args文字列を引用する必要があるのは面倒です。

制限にもかかわらず、これは単純な文字列を引数として使用し、Wordの分割を行う余裕があるため、エイリアスに引数を部分的に与えることができます。

3