それマグで!

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

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

xargs でシェルのalias を使えるようにする方法。

xargs で alias が使えない

takuya@:教科書$ find -type d -maxdepth 1  | xargs ll
xargs: ll: そのようなファイルやディレクトリはありません

悲しい。Aliasはあくまで bashエイリアスであり、シェル経由せずにfork するような場合には全く役に立たない。linux のコマンド実行の仕組みを知っていると別に不思議でもなんでもないんだけど初心者にはコレが不思議らしい。

xargs で alias を使う方法

sudo のときと同じように再帰的なalias展開を使えば、なんとかなる時がある。

alias xargs='xargs '

これをすれば 、動く

takuya@:教科書$ find -type d -maxdepth 1  | xargs  ll
./2018-04-23-スキャンファイル:
合計 336K

でもオプションを渡せない。

alias の再帰的な展開に限界があるので、xargsにオプションつけたら、を渡せない

takuya@:教科書$ find -type d -maxdepth 1  | xargs -p ll
xargs: ll: そのようなファイルやディレクトリはありません

あああ、、振り出しに戻る。。

bashを指定したり

 find -type d -maxdepth 1  | xargs -I@ bash -c 'source ~/.bashrc;ll @'

設定を同時ロードするようにシェルを指定したり

 find -type d -maxdepth 1  | xargs -I@ bash -ic 'll @'

シェル経由だとどうしても不都合が

コマンド文字のエスケープがあるので、ファイル名に「空白」 「&」などが挟まると面倒なことになる。

alias を変数として持ってきたり

エイリアスが、bash_aliases変数にあることを利用して

 echo "${BASH_ALIASES[ll]}"
ls -l -h

これをつかって

 find -type d -maxdepth 1  | xargs -I@ ${BASH_ALIASES[ll]} @

などと出来なくもないが、良い解決策はないようです。

めんどくさいけど xargsのラッパを書くしか無い。

どうしても使いたいのであれば、 /usr/local/bin/xargs.sh を作って

引数のaliasを手作業で展開するしか無いと思う。めんどくさいわりに得られるものがないので作るのはしないけど。

#!/bin/bash 
# 引数を受け取ってalias を展開する
#xargs  に渡し直す

結論

諦めましょう。

参考資料

https://unix.stackexchange.com/questions/141367/have-xargs-use-alias-instead-of-binary