BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Bashの環境変数とは何ですか?

コンピューティングでは、変数 変化する可能性のある値を表す言葉です。変数は変数とは考えていませんが、通常のスピーチでは毎日変数を使用します。 「私の車」と言うときは、「私の車」を、その時点で所有している車を指す一種の変数として使用しています。古い車を新しい車に交換すると、メーカーとモデルは人生の中で必ず変化しますが、変数「my car」を作成することで、現在どのような車が使用されているかを考える必要がなくなります。あなたがあなたの車を参照したいときはいつでも所有すること。

コンピューターでは、変数は同様の方法で使用されます。

たとえば、コンピュータにユーザーアカウントを持っている人は誰でも、コンピュータが個人データを保持するホームディレクトリを持っています。ただし、各ユーザーには個別のホームディレクトリ(/home/seth)があります。 Sethの場合、/home/tux Tuxの場合など)、したがって、一般的にホームディレクトリを参照する場合は、変数$HOMEを使用できます。 現在のホームディレクトリを示します ユーザーのログイン名に関係なく、ユーザー。

環境変数は特別な変数です($HOMEなど) )ログインセッションに関する情報が含まれています。これらは、コマンドの実行時にシステムシェルが使用するために保存されます。 Linux、Mac、Windowsのいずれを使用していても存在します。これらの変数の多くは、インストール時またはユーザー作成時にデフォルトで設定されます。

環境変数は最新のすべてのシステムに適用されますが、この記事では、Linux、BSD、Mac、およびCygwinのBashシェルの環境変数について具体的に説明します。

環境変数を理解する

環境変数は、技術的には変数と同じです。それらは、変数に使用されるのとまったく同じ構文で設定、呼び出し、およびクリアできます。 Bashで変数を使用することに慣れていない場合は、続行する前にBashの記事で変数を読んでください。

環境変数を直接使用することはあまりありません。これらは、必要に応じて個々のアプリケーションやデーモンによって参照されます。たとえば、ログイン時にホームディレクトリが環境変数として設定されます。たとえば、Linuxでは HOMEが表示されます。 次のような環境変数の内容:

$ echo $HOME
HOME=/home/seth

Macの場合:

$ echo $HOME
HOME=/Users/bogus

Windowsの場合:

C:\Users\bogus

env を使用して、システムに設定されているすべての環境変数を表示できます。 コマンド。 リストは長いので、出力をもっとにパイプします 読みやすくするために:

$ env | more
TERM=xterm-256color
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=seth
SUDO_EDITOR=emacs
WWW_HOME=https://mirror.lagoon.nc/pub/slackware/slackware64-current/ChangeLog.txt
VISUAL=emacs
DISPLAY=:0
PS1=$
XDG_DATA_DIRS=/home/seth/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
GDMSESSION=gnome
MAIL=/var/spool/mail/seth
[...]

環境変数は、デフォルト設定を上書きする場合、またはシステムが独自に作成する理由がない新しい設定を管理する必要がある場合に役立ちます。たとえば、コマンドを入力するとき、コンピュータが検索する方法を知っている唯一の理由 そのコマンドに対応するアプリケーションは、 PATH 環境変数は、どこを見ればよいかを示します。この変数は、コマンドが ls であるかどうかに関係なく、オペレーティングシステムがコマンドを検索するための有効なディレクトリを一覧表示します。 またはcp、またはFirefoxやLutrisなどのグラフィックアプリケーション、またはその他のもの。

さまざまな環境変数がさまざまなシステムで使用されます。あなたのパス たとえば、変数はターミナルエミュレータにとって不可欠ですが、たとえばJava(重要なJavaライブラリを指す独自のパスがあります)にとってはそれほど重要ではありません。ただし、ユーザー 変数は、サービスを要求しているユーザーを識別する方法として、いくつかのシステムで使用されます。たとえば、マルチユーザーシステムを使用していて、ローカルメールボックスを確認する必要がある場合、mailコマンドは、 MAILに基づいて取得するメールスプールを認識します。 およびユーザー 変数。

環境変数の設定

通常、インストーラプログラムは、 dnf であるかどうかに関係なく、 Fedoraでは、 apt Ubuntuでは、 brew Macまたはカスタムインストーラーでは、新しいアプリケーションの環境変数を更新します。ただし、ディストリビューションの目的のツールセットの外部に何かをインストールする場合は、環境変数を自分で管理する必要がある場合があります。または、好みに合わせて環境変数を追加することもできます。一部のアプリケーションをビンに保持することにした場合 ホームディレクトリにあるフォルダの場合は、そのディレクトリを PATHに追加する必要があります そのため、オペレーティングシステムは、コマンドを発行したときに実行するアプリケーションを探すことを認識しています。

一時的な環境変数

使い捨て変数を作成する方法で、パスに場所を追加できます。これは機能しますが、システムパスの変更に使用したシェルが開いたままである場合に限ります。たとえば、Bashシェルを開き、システムパスを変更します。

$ export PATH=$PATH:/home/seth/bin

結果を確認します:

$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin

セッションを閉じます:

$ exit

新しいものを開いて、パスを見てください 変数:

$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin

PATH が原因で、この変数はデフォルトの状態に戻りました。 新しいシェルごとに設定されていません。そのためには、シェルが起動されるたびにロードするように変数を構成する必要があります。

永続的な環境変数

シェル構成ファイルで独自の永続的な環境変数を設定できます。最も一般的なものは〜/ .bashrcです。 。複数のユーザーを管理するシステム管理者の場合は、 /etc/profile.dに配置されたスクリプトで環境変数を設定することもできます。 ディレクトリ。

構成ファイルで変数を設定するための構文は、シェルで変数を設定する場合と同じです。

export PATH=$PATH:/snap/bin:/home/seth/bin

現在のシェルを閉じるか、更新された構成を強制的にロードします:

$ . ~/.bashrc

最後に、システムパスをもう一度見てください。

$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin

これで、追加のカスタムディレクトリが含まれるように正しく設定されました。

他の環境変数の検出

環境変数は自由に作成および操作できますが、一部のアプリケーションはそれを実行します。この事実は、環境変数の多くがほとんどのアプリケーションで使用されていないことを意味します。独自の任意の変数を追加すると、一部はまったく使用されない可能性があります。したがって、問題は次のとおりです。どの環境変数が意味があるかをどのように見つけますか?

答えは、アプリケーションのドキュメントにあります。たとえば、一般的なBash環境で使用できるオプションを確認するには、Bashのドキュメントを参照してください。 Bashのmanページには多くの重要な変数が記載されていますが、BashのGNU情報ページには、便利なBourne ShellおよびBash環境変数の2つの完全なリストと、それぞれの使用方法が記載されています。

たとえば、情報ページリスト:

'HISTCONTROL'
     A colon-separated list of values controlling how commands are saved
     on the history list.  If the list of values includes 'ignorespace',
     lines which begin with a space character are not saved in the
     history list.  A value of 'ignoredups' causes lines which match the
     previous history entry to not be saved.  A value of 'ignoreboth' is
     shorthand for 'ignorespace' and 'ignoredups'.
     [...]

この出力は、 HISTCONTROL 環境変数は、Bash履歴の表示方法と、そのエクスペリエンスをカスタマイズするために使用できる値を制御します。この例では、無視された 値は、履歴の出力を示します 重複する行を無視するコマンド。

これは簡単にテストできます。まず、同じコマンドを2回続けて発行します。

$ echo "hello world"
hello world
$ echo "hello world"
hello world

履歴、または少なくとも最新のエントリを表示します:

$ history | tail -5
 996  man bash
 997  info bash
 998  echo "hello world"
 999  echo "hello world"
 1000 history

重複するエントリが実際にリストされていることがわかります。

.bashrcに新しい環境変数を設定します 情報ページで読んだ内容に基づいたファイル:

export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups

新しい構成を保存してロードします:

$ source ~/.bashrc

2つのコマンドを2回続けて発行します:

$ echo "hello once"
hello once
$ echo "hello once"
hello once

履歴の最新のエントリを表示する:

$ history | tail -5
 1000 history
 1001 emacs ~/.bashrc
 1002 source ~/.bashrc
 1003 echo "hello once"
 1004 history

指定された情報ページと同様に、新しい環境変数のために、重複するエントリが1つのエントリに折りたたまれます。

関連する環境変数を見つけることは、通常、影響を与えたいアプリケーションのドキュメントを読むことです。ほとんどの環境変数は、1つのアプリケーションをスムーズに実行するために必要なものに固有のものです。一般的なエントリの場合、シェルのドキュメントが論理的な場所です。新しい環境変数を必要とするスクリプトまたはアプリケーションを作成する場合は、必ず独自のドキュメントでそれらの変数を定義してください。


  1. Bash変数とは何ですか?それらをどのように使用できますか?

    Bashを使用すると、テキストの文字列全体を単一の変数にマップして、その使用とスクリプトの記述を簡素化できます。それらはどのように機能し、どのように使用できますか?調べてみましょう。 変数とは何ですか? 変数は覚えやすい名前であり、さまざまな英数字の値を含めることができます。スクリプトやコードを書き直すことなく、同じ関数を異なる値に適用できるので便利です。また、個々の値を処理する代わりに、すべての値に同じ名前を使用できるため、スクリプト/コードの一部を簡単に記述できます。 リアルタイム変数 Bashでは変数を使用できます。その場で変数を作成し、現在のBashセッション中にそれらを再利用でき

  2. 環境変数の保護

    前回の記事「環境変数に関するRubyistのガイド」では、環境変数システムがどのように機能するかを示し、いくつかの一般的な神話を打ち破りました。しかし、ある有益な読者が指摘したように、セキュリティについてはあまり言及していませんでした。 秘密のAPIキーやその他の貴重な情報を保存するためにenvvarsを使用することが一般的になっているため、セキュリティへの影響を理解することが重要です。見てみましょう: 最悪のシナリオ ハッカーがrootとして、またはWebアプリケーションを所有するユーザーとしてサーバーにアクセスしたと想像してみてください。その場合、高度に暗号化されていない他のすべてのも