2つの別名があります(明らかに隠されています)。
alias ki='kinit -kt ~/.keytab alexdodd@box'
alias pt='function _pritunl() {/Applications/Pritunl.app/Contents/Resources/pritunl-client start 0e7e534335bsdfds6eaeb8e023a5ce4 --password XXXX$1; echo attempting pritunl login };_pritunl'
私は間違いなくそれらを互いに接続して、次のように順番に実行できると思いました。
alias ptki='function _ptki() {
pt $1
ki
if [ "$DEV_STACK_NAME" -ne 1 ]; then
echo "Starting devstack"
devstack start
fi
}'
しかし、引数$ 1はエイリアスptに渡されません(構文解析エラーが発生しました)`、私は愚かであることを知っていますが、ここに何かがありませんでした。私は検索しようとしましたが、私たちは基本的なように見えるので、何がわかりません。私が探しています。
明らかに私はbashスクリプトに触れたことがありません=/私が学ぶべきものの長いリストに追加する
エイリアス "ptki"を使って3つのエイリアスを順番に実行したいと思います。 ptkiはパラメータを取得して渡す必要があります。
最初は引数を受け入れ、それをエイリアスに渡します。 2番目は最初のものから10秒待つ必要があります。 3 番目は DEV_STACK_NAME が存在する場合にのみ実行されます。
答え1
まず、読みやすさとメンテナンスが容易であるため、関数定義で別名を「ショートカット」として使用しないことをお勧めします。もともと異なる意図を持つ関数やスクリプトで実装されたことを覚えたり、さらには知っているのです。
次に、スクリプト/関数でエイリアスを使用する必要がある場合、マンbash
ページは非対話型シェル(スクリプトなど)ではエイリアスが拡張されないことを示しています。その中で拡張するには、スクリプト内で実行するようにこれらのエイリアス(通常または)を定義するファイルとshopt -s expand_aliases
スクリプトを追加する必要があります。私にとっては、スクリプト内で調達することはどんな場合にも最適ではありません。主に、特定のホストシステムに何があるのかは常にわからないからです。デフォルトでは、スクリプト内でシェルエイリアスを呼び出すには、次のものが必要です。source
~/.bashrc
~/.bash_aliases
~/.bashrc
~/.bashrc
誰でもBASH_ENV
呼び出し bash シェル環境で環境変数を定義します。または#!/usr/bin/bash -i
スクリプトで shebang として使用されます。man bash
スクリプトシェルをインタラクティブにする方法のセクションを見て見つけてください。BASH_ENV
しかし(再び)これは良い習慣に違反し、遅かれ早かれ、あなたや他の人がスクリプトでエイリアスを虚偽として使用して問題に遭遇することを意味します。代わりに機能を試してください。
したがって、示した小さなコードの内容を扱うことなく、呼び出されたスクリプトで実行する必要がある方法は、基本的に次のようmy_script
になります。
#!/usr/bin/bash
function _pritunl() {
/Applications/Pritunl.app/Contents/Resources/pritunl-client start \
0e7e534335bsdfds6eaeb8e023a5ce4 --password XXXX"$1"
echo "attempting pritunl login"
}
function _ptki() {
_pritunl "$1"
kinit -kt ~/.keytab alexdodd@box
if [ "$DEV_STACK_NAME" -ne 1 ]; then
echo "Starting devstack"
devstack start
fi
}
_ptki "$1"
.. 次に、スクリプト(my_script
)を実行可能にし、実行するか、直接実行します。
$ bash my_script first_arg
これはスクリプトの最初の位置パラメータfirst_arg
に対応します。$1
上記のスクリプトには問題があり、リストの最初のものは@roaimaがOPの説明で指摘したものです。これはおそらく問題を解決する正しい方法ではないでしょう。しかし、もしそうなら以下が必要であることを覚えておいてください。