スクリプトが下付き文字の代わりに実行可能として表示されるようにコマンドをラップするにはどうすればよいですか?

スクリプトが下付き文字の代わりに実行可能として表示されるようにコマンドをラップするにはどうすればよいですか?

メモリ使用量を制限するためにRスクリプトをラップしました/usr/lib/R/bin/exec/R。名前を変更し/usr/lib/R/bin/exec/R_orig/usr/lib/R/bin/exec/Rコンテンツ名にちなんでbashスクリプトを作成しました。

#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"

これはこの特定のプログラムの私の経験で大きな改善でしたが、そのいくつかは実際にパッケージのインストールパスを決定するために実行可能ファイル名を使用し、実行可能ファイル名が変更されたため失敗したことを発見しました。

/usr/lib/R/bin/exec/R私のスクリプト自体を実行可能ファイルと見なすことはできますか?たとえば、top個々の子プロセスを表示せずにR_origプロセスのみを表示しますかR

答え1

しないでください。元のコンテンツを文字列を標準出力に出力するコンテンツに置き換えることで、出力を解析できるRアプリケーションを混同する可能性があります。

代わりに、新しい名前でラッパースクリプトを作成し、元のR実行可能ファイルを変更しないでください。このスクリプトを/usr/lib/R/bin/exec同様の場所に置かないでください/usr/local/bin(すべてのユーザーがアクセスする必要がある場合)。また、将来のパッケージのアップグレードや削除スクリプトを混同することはありません。

シェル起動ファイルでシェル関数を定義することもできます。

myR () (
    echo "Memory limited to 10G"
    ulimit -Sv 10000000 #limit memory for 64-bit version
    exec /usr/lib/R/bin/exec/R "$@"
)

別の明確な選択は、シェル初期化スクリプトで制限(~/.bashrcfor)を設定することですbash。この制限は、シェルで開始されたすべてのプロセスに適用されます。

答え2

あなたの質問に答えるために、スクリプトの最後の行を次に変更してください。

exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

これは、R_origをスクリプトの子プロセスとして実行するのではなく、現在のプロセス(スクリプトを実行するシェル)をR_origプログラムに置き換えます。また、既存の最初の引数であるプログラム名を元の名前として渡します。インストールされているパッケージを見つけるほとんどのプログラムはこの名前を使用します。

私は「メモリ制限は10Gです」というメッセージを出力するのは悪い考えだという@Kusalanandaのコメントに同意します。本当にこれを行うには、stderrに出力します。これはスクリプトが次のようになることを意味します。

#!/bin/bash
echo "Memory limited to 10G" >&2
ulimit -Sv 10000000 #limit memory for 64-bit version
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

関連情報