実行ファイルmpiexec
があり、そのフルパスは~/petsc-3.2-p6/petsc-Arch/bin/mpiexec
です。このコマンドを別のディレクトリで(パス全体を再入力せずに)実行したいので、ホーム.bashrc
ファイルにエイリアスを設定します。
alias petsc="~/petsc-3.2-p6/petsc-Arch/bin/mpiexec"
次のように入力することで、コマンドプロンプトでこのmpiexec
ファイルを簡単に実行できます。
petsc myexecutable
コマンドとして新しいエイリアスscript
を使用して、petsc
という名前のシェルスクリプトファイルを記述しようとしました。シェルスクリプトに適切なアクセス許可(chmod
を使用)を付与した後、スクリプトを実行しようとしました。ただし、次のエラーが表示されました。
./script: line 1: petsc: command not found
mpiexec
ファイルへのフルパスを書き込むことができることは知っていますが、新しいスクリプトを作成するたびにフルパスを書き込むのは面倒です。スクリプトファイル内でエイリアスpetsc
を使用する方法はありますか?これを実現するために.bashrc
または.bash_profile
を編集する方法はありますか?
シェルスクリプトでは、エイリアスではなくフルパスを使用します。
シェルスクリプトで、変数、異なる構文を設定します
petsc='/home/your_user/petsc-3.2-p6/petsc-Arch/bin/mpiexec'
$petsc myexecutable
スクリプトで関数を使用します。 petsc
が複雑な場合はおそらくより良い
function petsc () {
command 1
command 2
}
petsc myexecutable
エイリアスを取得する
shopt -s expand_aliases
source /home/your_user/.bashrc
おそらく.bashrc
を調達したくないので、IMO、最初の3つのうちの1つがより良いでしょう。
エイリアスは非推奨になり、シェル機能が優先されます。 bash
マニュアルページから:
For almost every purpose, aliases are superseded by Shell functions.
関数を作成し、サブシェルにエクスポートするには、~/.bashrc
に次を入力します。
petsc() {
~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
}
export -f petsc
その後、スクリプトからコマンドを自由に呼び出すことができます。
シェル関数とエイリアスはシェルに限定され、実行されたシェルスクリプトでは機能しません。あなたの場合の代替案:
(mpiexec
の代わりにpetsc
を使用しない場合)PATH
変数に$HOME/petsc-3.2-p6/petsc-Arch/bin
を追加します。これは、~/.profile
を編集して追加することで実行できます。
PATH="$HOME/petsc-3.2-p6/petsc-Arch/bin:$PATH"
これらの変更を適用するには、再ログインしてください
ディレクトリ~/bin
を作成し、
次を含むpetsc
という名前のラッパースクリプトを作成します。
#!/bin/sh
exec ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
プログラムで許可されている場合は、次のコマンドを使用してシェルスクリプトをスキップしてシンボリックリンクを作成できます。
ln -s ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec ~/bin/petsc
Bash 4では、特別な変数 $BASH_ALIASES
を使用できます。
例えば:
$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo `${BASH_ALIASES[foo]}` bar
test bar
または、変数として定義してから、コマンド置換またはeval
を使用します。
したがって、たとえば、次のようなエイリアスを定義する代わりに:
alias foo="echo test"
次のように定義します:
foo="echo test"
代わりに。次に、次のいずれかの方法で実行します。
find . -type f -exec sh -c "eval $foo" \;
または:
find . -type f -exec sh -c "echo `$foo`" \;
ALIASES
...
Aliases are not expanded when the Shell is not interactive, unless the expand_aliases Shell option is set using shopt (see the description of shopt under Shell BUILTIN COMMANDS
below).
したがって、この質問に対する本当の答えは、シェルスクリプトの代わりに実際のエイリアスを使用することを考えている人にとっては、次のとおりです。
#!/bin/bash
shopt -s expand_aliases
alias foo=bar
foo whatever
whyの場合:異常な状況のため、Dockerfileをだましてシェルスクリプトだと思わせる必要があります。
-iフラグを使用して、bashにスクリプトを対話型シェルとして強制的に実行させることができます。これにより、 。bashrc file にエイリアスと他の関数を定義するよう指示されます。
例:
~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh
#!/bin/sh
ll
~ $ bash script.sh
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..
詳細:
$ man bash
.bash_aliases
::
petsc {
~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
}
または、.bashrc
に関数を配置します。通常、.bashrc
にはbash
の設定のみが保存されます。
ターミナルで:source .bash_aliases
petsc arg(s)
利点:export -f petsc
in .bash_aliases
は必要ありません。エイリアスは非推奨ですが、関数に.bash_aliases
を使用しても問題ありません。
したがって、エイリアスの使用を含むコマンドにscript.sh
というファイルがある場合は、次のように入力します。
source script.sh
(編集:mpiexecの呼び出しを読み間違えたため、関数を削除しました。)
必要なのがタイピングを減らすことだけなら、フォルダーを$ PATHに入れてみませんか?または、$ PATHのフォルダーからmpiexecへのシンボリックリンクを作成しますか?または(私のお気に入り)呼び出し元スクリプトでソースを作成するスクリプトにエイリアスを配置しますか?