web-dev-qa-db-ja.com

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

実行ファイル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を編集する方法はありますか?

99
Paul
  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つがより良いでしょう。

72
Panther

エイリアスは非推奨になり、シェル機能が優先されます。 bashマニュアルページから:

For almost every purpose, aliases are superseded by Shell functions.

関数を作成し、サブシェルにエクスポートするには、~/.bashrcに次を入力します。

petsc() {
    ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
}
export -f petsc

その後、スクリプトからコマンドを自由に呼び出すことができます。

57
enzotib

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

  • 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
      
12
Lekensteyn

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`" \;
8
kenorb
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をだましてシェルスクリプトだと思わせる必要があります。

5

-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
5
Amado Martinez
  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 petscin .bash_aliasesは必要ありません。エイリアスは非推奨ですが、関数に.bash_aliasesを使用しても問題ありません。

4
Timo
  1. シェルスクリプトでエイリアスを使用します。
  2. スクリプトを実行する代わりに、現在のインタラクティブなシェルでソースします。

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

source script.sh
2

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

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

1
unhammer