シェルスクリプトでエイリアスを実行する方法は?


101

mpiexec完全なパスが.exeである実行可能ファイルがあります~/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、これを実現する方法はありますか?


エイリアスを追加してみ.bash_aliasesませんか?また、どのように相対パスではなく絶対パスをエイリアシングについてalias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
ニティン・ベンカテッシュ

@nitstorm:どちらのソリューションも機能していないようです...私はまだ以前と同じエラーを受け取ります
Paul

回答:


74
  1. シェルスクリプトでは、エイリアスではなくフルパスを使用します。

  2. シェルスクリプトで、変数、異なる構文を設定します

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. スクリプトで関数を使用します。petsc複雑であればおそらくより良い

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. エイリアスを取得する

    shopt -s expand_aliases
    source /home/your_user/.bashrc
    

おそらく、ソースを取得したくない.bashrcので、IMO、最初の3つのうちの1つがより良いでしょう。


16
ポイント4はshopt -s expand_aliases、同じスクリプトで使用しない限り機能しません。
-enzotib

あなたの提案2)は機能しますが、私は最初の行petsc = "..."を書くことなく、複数のシェルスクリプトで同じコマンドを使用できるようにしたいと思います。これを行う方法はありますか?
ポール

1
@enzotib-ありがとう、私はそれを私の答えに加えました。
パンサー

1
ポイント2では、エイリアスではなく変数を設定します。
pabouk 14年

1
OPからは要求されませんが、質問のタイトルに関連します|。ポイント2は、を含むコマンドでは機能しません。ここでは、use shopt -s expand_aliases&local alias、たとえばalias myalias='echo abc|rev'-使用する前に改行が必要です(のエイリアスを参照man bash)。ポイント4:ソースファイルは、非インタラクティブな実行、つまりスクリプト内での実行を妨げる可能性があります。早期探しexitまたはreturn例えば、[ -z "$PS1" ] && return(プライマリープロンプトを非対話型シェルを示す設定されていない場合はチェック)、またはのためにチェックがあるかもしれi$-$-シェルオプションが含まれ、iインタラクティブな意味)。man bashそれらの変数を参照してください。
有効

61

エイリアスは非推奨となり、シェル関数が優先されます。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 -n 40 myexecutable」のようなものを実行できるようにする必要がありますエイリアス「petsc」
ポール

4
@Paul:"$@"引数を処理するためだけに追加しました。
-enzotib

12

シェル関数とエイリアスはシェルに限定され、実行されたシェルスクリプトでは機能しません。あなたの場合の代替案:

  • (のmpiexec代わりにわざわざ使用しない場合petsc)変数に追加$HOME/petsc-3.2-p6/petsc-arch/binしますPATH。これは、編集~/.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

9

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`" \;

シェル関数を優先してエイリアスは完全に非推奨になりましたが、この答えは受け入れられる唯一のものです。古いDebian 8でもバージョン4のbashがあるため、これ${BASH_ALIASES[alias]}は素晴らしいオプションです。それ以外の場合は、.bash_aliasesの多くの行を編集して他のことを適用する必要がありました。ありがとうございました。
erm3nda

8

-iフラグを使用して、bashにスクリプトを対話型シェルとして強制的に実行させることができます。これにより、.bashrcファイルにエイリアスと他の関数を定義するように指示します。

例:

~ $ 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

2
.bashrc非対話型SSHコマンドの実行中にも読み取られます(そのため、上部に対話性のチェックがあります)
-muru

6
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

用として、なぜ私はこれをしたいと思います:により異常な状況に、私はそれがシェルスクリプトだという考えにDockerfileをだましする必要があります。


4
  1. .bash_aliases

    petsc {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
    }
    

    または、関数をに入れます.bashrc。通常の.bashrc設定のみでbash保存されます。

  2. ターミナルで: source .bash_aliases

  3. あれを呼べ: petsc arg(s)

アドバンテージ:あなたは必要としないexport -f petsc.bash_aliases。エイリアスは非推奨ですが.bash_aliases、関数に使用しても問題ありません。


私はこのソリューションが好きです。後で試してみます
-Greenonline

2
  1. シェルスクリプトでエイリアスを使用します。
  2. スクリプトを実行する代わりに、現在の対話型シェルでソースします。

したがって、script.shエイリアスの使用を含むコマンドで呼び出されるファイルがある場合は、次のように入力します。

source script.sh

@DavidFoerster このメソッドは正常に機能します。.またはsourcebuiiltinを使用してスクリプトをソースすると、現在のシェルがその中すべてのコマンドを実行します。.またはsourceが実行されているシェルでエイリアス展開が発生する場合、それが発生します。ただし、多くの場合、独自の環境で、独自のシェルでスクリプトを実行する必要があるか、または実行したいため、このメソッドは時々役立つことを認識することが重要です。通常の方法で実行されることを意図して書かれたシェルスクリプトは、通常、代わりにソースされるべきではありません-それらはしばしば正しく動作しません。
エリアケイガン

@EliahKagan:ありがとう。今、私は答えが何を意味するのか理解しています。説明を追加します。
デビッドフォースター

1

(編集:mpiexecの呼び出しを読み間違えたため、関数を削除しました。)

必要なのがタイピングを減らすことだけなら、フォルダーを$ PATHに入れてみませんか?または、$ PATHのフォルダーからmpiexecへのシンボリックリンクを作成しますか?または(私のお気に入り)呼び出し元のスクリプトでソースするスクリプトにエイリアスを配置しますか?


1
$ PATHに入れられないのは、$ PATHに既にある別のディレクトリに別の 'mpiexec'ファイルがあるためです。この新しい「mpiexec」にパスを追加すると、おそらく両方を実行しようとします...そうではありませんか?
ポール

1
なぜ単純に使用しないのか理解できません"$@"
-enzotib

2
ポール、両方ではなくPATHで最初のものを実行しようとします。
アンハンマー

enzotib、ああmpiexecの呼び出し方を誤解しました。すべての引数を1つとして必要だと思いました。私の答えを編集します:)
アンハンマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.