構文内でエイリアスを実行したいですbash -c
。
これbash
手動説明する:
シェルが非対話型の場合、
expand_aliases
シェルオプションを使用して設定しないと、エイリアスは拡張されません。shopt
hi
この例で明示的に設定してもエイリアスが見つからないのはなぜですかexpand_aliases
?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
私は走っていますGNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
。
コンテキスト:次のようなスクリプトなど、アイドル優先順位でエイリアスを実行できるようにしたいです。
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
私のコンテンツが読まれたくbash -i
ないので、使用を避けたいです。.bashrc
ベストアンサー1
使用中の同じ行にエイリアスを設定しても機能しないようです。それはおそらく、実際の解析ステップの前にコマンドライン処理の最初にエイリアスを拡張する方法と関係があります。インタラクティブシェルでは:
$ alias foo
bash: alias: foo: not found
$ alias foo='echo foo'; foo # 2
bash: foo: command not found
$ alias foo='echo bar'; foo # 3
foo
$ foo
bar
使用されるエイリアスは1行の後ろにあります。 2番目のコマンドでは、設定したエイリアスは見つかりませんが、3番目のコマンドは以前に設定したエイリアスを使用します。
したがって、文字列に改行文字を追加すると機能します-c
。
$ bash -c $'shopt -s expand_aliases; alias foo="echo foo";\n foo'
foo
bash -O expand_aliases -c ...
(代わりにスクリプトで使用することもできますが、shopt
改行に役立つという意味ではありません。)
あるいは、エイリアスの代わりにシェル関数を使用することもできます。これは他の方法でも優れています。
$ bash -c 'foo() { echo foo; }; foo'
foo