web-dev-qa-db-ja.com

Linux Redhat 7:シェルオプションをグローバル/システム全体に設定するにはどうすればよいですか?

Linux RedHatシステム(7.4)で実行されるすべてのシェルに対してbashのxpg_echoオプションをオンにする方法を理解しようとして問題が発生しています。

shopt -s xpg_echoを使用することで、必要なものを入手できることを知っています(目的は、すべてのシェルがHP-UXサーバーから移植されるため、いつでもバックスラッシュエスケープを拡張することです)。ほとんどの場合、正常に機能します。

今私の問題は、このオプションを「システム全体」または「グローバルに」オンにして、実行するすべてのシェルがそれを使用するようにすることです。

shopt -s xpg_echo/etc/profile.d/myshell.shの1つのカスタムシェルに入れてみました。

それは以下のためにうまく働いています:

  • インタラクティブシェルセッション(/etc/bashrcから供給されます)
  • ログインシェルセッション(/etc/profileから取得)
  • Bashシバンのないシェルプログラム(つまり、1行目に#!/bin/bashはありません)

しかし、/etc/profile.d/スクリプトがソースされておらず、xpg_echoオプションが呼び出し元のシェルから継承されていないため、次の場合に機能させることができません。

  • シェルスクリプト(たとえば、echo "a\tb"を使用)をbash引数として実行する場合。 bash /tmp/mytest.sh
  • 1行目にbashShebang(#!/bin/bash)があるシェルスクリプトを実行する場合

シェルを実行する必要があるすべての条件でシェルオプションxpg_echoをオンにする方法があるかどうか知りたいのですが。

注意:私はGNU bash、バージョン4.2.46を使用しています

4
R. Du

別の 関連トピック を教えてくれてありがとう。

私にとって重要なのは、BASH_ENV変数を使用することでした。

Bashのリファレンスマニュアルに記載されているように、 シェルを開くいくつかの方法 があります。問題を引き起こしたのは、「非対話的に」呼び出されたときでした。

非対話型シェルが/etc/profile/etc/bashrcも実行しないという事実を回避するために、/etc/profile.d/に専用のシェルスクリプトを作成しました。 「custom_shopts.sh」には、すべてのセッションに必要なshoptオプションのみが含まれ、この同じスクリプトで変数BASH_ENV=/etc/profile.d/custom_shopts.shをエクスポートします。

したがって、私が実行するすべてのシェル(ログインシェル、インタラクティブシェル、または非インタラクティブシェル、ただしbash --posixを除く)では、/etc/profile.d/custom_shopt.shシェルスクリプトが実行され、ショップオプションが配置されます。 m期待しています。

1
R. Du