9 今さら…: bash で引数のある “alias” (実は alias でなくて function を使う)

自分用のちょっとしたコマンドを作るのに、 シェルの機能が利用できる。 シェル・スクリプトとかエイリアス (alias, 別名) とか。

シェル・スクリプトはなるべく /bin/sh を使うようにしているのだが、 エイリアスは普段使っているシェル (私の場合は tcsh) の機能を使うことになる。

長いの打ちたくないとか、オプション覚えられないとか。
alias   big     'ls -lSr'
alias   less    'lv -Ou'
alias   m1      'slogin -X -A ホスト名.mind.meiji.ac.jp -l mk'
alias   ol      'open `(ls -tr|tail -1)`'
alias	clear	'printf "\033[?2004l"; /usr/bin/clear'
alias	vpnoff	'launchctl unload -w /Library/LaunchAgents/net.pulsesecure.pulsetray.plist'
alias	vpnon	'launchctl load -w /Library/LaunchAgents/net.pulsesecure.pulsetray.plist'
alias   rerun   'source ~/.tcshrc'
alias   syncw    'rsync -avuz ホスト名.mind.meiji.ac.jp:work/ ~/work'
(勧めているわけではないので説明は書かない。 面倒が減りそう、だけを分かってもらえれば良い。)

その中には、引数を伴うものもある。
alias   utf     'nkf --overwrite -w -Lu \!*'
alias   dlp     'lpr -o sides=two-sided-long-edge \!*'
alias   cco     'gcc -O -o \!^:r \!*'

この cco などは、某先輩に教わったものだが、なかなか面白い。
cco test1.c test2.c test3.o -lm
とすると
gcc -O -o test1 test1.c test2.c test3.o -lm
のように展開されるわけである (その気になれば -L/usr/local/lib -lglscd とか、 -I/usr/local/include とか書き足せる)。

今回は学生の Mac で実現することになったので、 tcsh でなくて、bash を使うことに。 tcsh で
alias  upload   'scp -pr \!* ユーザー名@ホスト名.mind.meiji.ac.jp:work'
のように定義するエイリアス (指定したファイルを、ホスト名.mind.meiji.ac.jp というホストの、 ユーザー~/work にコピーする) と同じ機能を bash で実現しようとして、はまった。

もちろん
~/bin/upload (現象数理 Mac ならば ~/bin に置くのかな。)
#!/bin/sh
scp -pr "$@" ユーザー名@ホスト名.mind.meiji.ac.jp:work
のようなシェル・スクリプトを作る、というような逃げ道はある。

ネットでお尋ねしたところ、 引数をコマンド引数の途中に挿入する “別名” は、別名でなくて、 関数 (function で定義) を使って実現しなさい、とのことでした。

.profile に書き加える
function upload() {
  command scp -pr $@ ユーザー名@ホスト名.mind.meiji.ac.jp:work
}

桂田 祐史
2020-04-20