それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashのalias に引数を渡すには?

Bash のAliasに引数を渡す。

何も考えずに、Aliasをするとそのまま渡される。

alias some=echo
some aaaaaaa

alias は実行前に、bashが解釈するために some aaaaaaaecho aaaaaaa` に展開される。

出来ない。

なので次のようなことは出来ない。

alias git-push-to='git push "$@" master'

これは、bash の実行前に git-push-to remoteA git push "" master remoteA と展開されてしまう。

展開順について。

先の例は、展開が次のようになる。

git-push-to remoteA 

これは、次のように展開。

git push "" master remoteA 

引数は受け取れない。

引数は受け取れない。なぜなら、単純な置換がされるだけだから。

bashのコマンド引数を順番を変えて、aliasに渡すには?

alias でなく関数を使う

まぁ頻出の話題なので、これくらいは基本ですよねってことで。

alias fooo="/path/to/cmd $@ -opts" は出来ない

alias fooo="/path/to/cmd --opts $@ " # できる
alias fooo="/path/to/cmd $@ --opts" # 出来ない
funciton fooo (){ /path/to/cmd $@  --opts } # 出来る

というわけで、alias だとoptionsと引数の順番を指定できないのです。

代わりにFunctionを使うって話です。

引数はと$@ 使っておけば大丈夫です。

  • $@ 引数全部
  • $1 一個目
  • $2 二個目
  • $3 三個目

のように引数を渡せる。

function はbashrcに

functionは ~/.bashrc などに記述しておくといいでしょう。

echo function foo {} >> ~/.bashrc

もし.bashrc をデフォルトから汚したくない!と思う人は(まれでしょうが)

echo source .bashrc.takuya >> .bashrc
echo function foo {} >> ~/.bashrc.takuya

などと、自前の.bashrcをロードする設定を.bashrcに書いておけば解決ですね。

若しくはコマンドファイルを作る

関数を作る以外には、「コマンド」を作るというのが太古から習わしです。

touch fooo
chomod +x fooo
vim fooo
mv fooo ~/takuya/.bin
export PATH=~/takuya/bin:$PATH

コマンドファイルを作って、PATHを通す。

fooo

コマンドファイルには次のように記述します。

#!/usr/bin/env bash

/path/to/cmd $@ 

記述することはfunciton と同じです。

ファイルを作ると管理が面倒?

一番手っ取り早いのでファイルを作る手段も知っておくと便利です。

function とファイルをどちらを使うべきか

好きな方でいいです。管理の容易さ、一覧性などを考えて好きな方で良いと思います。

ただし、zsh/bash などを使い分ける場合や、ユーザーを切り替えてsu/sudo する場合は「ファイルの方がいいと思います」

function は個人専用だったりシェル・スクリプト中で使うものだと思います。

あれ?これってalias?function?

あれれ?このコマンドってalias のfunciton なの?それともコマンドファイル?

aliasを作りまくってるとわからなくなるので

  • hash
  • type

で確認します。

hash / type の例

type で現在のコマンドがなにか分かります。hash でそのコマンドがどのようにハッシュ(キャッシュ)されているかが分かります。

hash
takuya@~ $ hash
hits    command
   1    /usr/local/bin/rm-trash-by-takuya
   0    /bin/rm
type
takuya@ ~ $ type rm
rm は `rm-trash-by-takuya' のエイリアスです

bashはコマンドをなんどもPATH探索しなくてもいいようにhashテーブルに読み込んでいます。

追記

正確には shopt -s expand_aliasesしているときの動作なのだが、expand_aliasesなど今更無効にできるわけもなく

過去資料

bash(csh)のhashとか言う、気づかないけど便利な機能 - それマグで!

シェルにコマンドが存在するか調べる - それマグで!

更新

2021-06-04 更新。