Bash のAliasに引数を渡す。
何も考えずに、Aliasをするとそのまま渡される。
alias some=echo some aaaaaaa
alias は実行前に、bashが解釈するために some aaaaaaa
は echo 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 更新。