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