いくつかのリモートマシンがあり、そこでソースコードをコンパイルする必要があります。私が普段していることは、エイリアスを書くことです。
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 ++のエイリアスを記述できないことを意味します。引数を取るエイリアスを書く方法はありますか?私は何をすべきか?
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` "$@"
}
あなたはできる:
~/.bashrc
ファイルに追加して、新しいシェルを起動するか、. ~/.bashrc
を実行します。これは、g++
という関数を定義します。エイリアスとは異なり、関数は自分自身を呼び出すことができるので、望ましくない 再帰 を防ぐためにcommand
builtin を使用しました。 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
を呼び出す代わりに) スチールドライバーが提案した 。
次に、リモートでコンパイルするとき
それがあなたの主な問題です。ローカル設定ファイルまたはローカルインタラクティブシェルで定義されたエイリアスは、リモートシステムでは機能しません。リモートマシンの~/.bashrc
でエイリアスを定義すると、そのエイリアスが機能します。
Eliahが提案したように、より良いアプローチは関数を定義することです。ただし、エイリアスの場合と同様に、リモートマシンで定義する必要があります。