web-dev-qa-db-ja.com

引数を取るエイリアスを作成できますか?

いくつかのリモートマシンがあり、そこでソースコードをコンパイルする必要があります。私が普段していることは、エイリアスを書くことです。

alias g++='g++ `pkg-config --cflags opencv --libs opencv`'

次に、リモートでコンパイルするときに、g++ -o test test.cppを実行します。

なんらかの理由で、Ubuntuはそれを許可しません。代わりに、Ubuntuが動作します。

g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`

しかし、これは、g ++のエイリアスを記述できないことを意味します。引数を取るエイリアスを書く方法はありますか?私は何をすべきか?

5
j0h

TL; DR:エイリアスでcommand g++の代わりにシェル関数でg++を使用します。

6.6エイリアスBashリファレンスマニュアル のように:

cshのように、置換テキストで引数を使用するメカニズムはありません。引数が必要な場合は、シェル関数を使用する必要があります( シェル関数 を参照)。

エイリアスは追加テキストの前に表示される場合でも展開されますが、エイリアス自体は 位置パラメータ (つまり、コマンドライン 引数 )をサポートしないため、現在のタスクを実行するエイリアス。つまり、エイリアスを使用して、ユーザー指定の引数に続けて追加の引数を指定してコマンドを実行することはできません。

見つけたように、エイリアスを使用してg++ file.cpp -o fileを実行できます。

g++ `pkg-config --cflags opencv --libs opencv` file.cpp -o file

しかし、notg++ file.cpp -o fileでこのコマンドを実行するには:

g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`

したがって、それが必要な場合は、おそらく シェル関数 を使用する必要があります。

g++ () {
    command g++ `pkg-config --cflags opencv --libs opencv` "$@"
}

あなたはできる:

  • コマンドラインで実行すると、現在のシェルが実行されている限り、そのシェルインスタンス内でのみ定義されますor
  • ~/.bashrcファイルに追加して、新しいシェルを起動するか、. ~/.bashrcを実行します。

これは、g++という関数を定義します。エイリアスとは異なり、関数は自分自身を呼び出すことができるので、望ましくない 再帰 を防ぐためにcommandbuiltin を使用しました。 command g++は、外部g++コマンドを呼び出します。 "$@" expands は、関数に渡されるすべてのコマンドライン引数になります。

g++が本当にneededエイリアスであるという非常にまれなケースでは、「チート」して関数のエイリアスとして定義できます(他のコマンドのエイリアスを定義できるように)。これを行うには、最初に関数を定義するか、エイリアスで毎回定義します( Georgeが示唆する )。ただし、これを行う必要はありません。関数は正常に動作します。

もちろん、alwaysg++pkg-config --cflags opencv --libs opencvの出力を渡したくないかもしれません。そのため、エイリアス定義をファイルに入れて、必要なときにだけソースを作成することができます。定義がホームディレクトリのg++-fn.shにある場合、機能を有効にするには、次を実行します。

. ~/g++-fn.sh

(どのように定義されたとしても)関数を無効にするには、次を実行します:

unset -f g++

私はそれを追加する必要があります。小さなプログラムやささいなプログラム以外の場合は、少なくともmakeを使用することを検討する必要があります(毎回g++の出力でpkg-configを呼び出す代わりに) スチールドライバーが提案した

4
Eliah Kagan

次に、リモートでコンパイルするとき

それがあなたの主な問題です。ローカル設定ファイルまたはローカルインタラクティブシェルで定義されたエイリアスは、リモートシステムでは機能しません。リモートマシンの~/.bashrcでエイリアスを定義すると、そのエイリアスが機能します。

Eliahが提案したように、より良いアプローチは関数を定義することです。ただし、エイリアスの場合と同様に、リモートマシンで定義する必要があります。

2