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文字列を引用する必要があるのは面倒です。
制限はありますが、これは単純な文字列を引数として使用できるため、単語を分割する余裕があるため、エイリアスに引数を指定できます。