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


18

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

例えば:

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

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

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


(t)cshでは、「\!*」はエイリアスへの引数を参照します(バックスラッシュは、通常「履歴」を意味する感嘆符をエスケープするためのものです)。したがって、おそらく「tail -n \!*」または何か(直前にマイナス記号を付けて\!*が機能するとは思わない)。ただし、これが(ba)shで機能するかどうかはわかりません。
バリーカーター

回答:


20

エイリアスは引数を取りません。エイリアスと同じように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

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


私のような機能的に挑戦された人のために:)それは機能をどこに置くかを簡潔に述べるのに役立つかもしれません...すなわち~/.bashrcrc.localまたはどこに?
WinEunuuchs2Unix

@ WinEunuuchs2Unixエイリアスが置かれている場所。
ムル

5

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

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

foowith を呼び出します:

foo arg1 arg2 arg3

4

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

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

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

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

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

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

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

スペースで区切られた引数を格納するために単語分割を利用することもできます。

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文字列を引用する必要があるのは面倒です。

制限はありますが、これは単純な文字列を引数として使用できるため、単語を分割する余裕があるため、エイリアスに引数を指定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.