問題ID:27946について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-13 11:20
takashi0312  新米   投稿数: 2
問題の解説にenvコマンドのオプション「-u」について下記の様に記載されていますが、
---------------------------------------
オプション等  |説明
-u 環境変数名 |環境変数を一時的に削除
---------------------------------------

解説の最下部に記載されているリンク先には下記の様に記載があります。
---------------------------------------
-u, --unset=NAME
 環境変数から指定した変数を削除する
---------------------------------------

"一時的"の有無でかなり違いが出てしまうように思えるのですが。
どちらの記載が正しいのでしょうか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-15 2:04
pancake  新米   投稿数: 3
これは、「削除」の影響する範囲を、「envの環境下限定で見る」か、「envを発行する前と、envの効力が終わった後の環境下も含めて見る」かの違いなのではないでしょうか。
問題27946の実行例を実際にやってみるとわかるのですが、全部の実行例を実施した後、つまり、「env -u」も実行し、そのコマンドの効力が終了した後、「env -u」で指定した環境変数は残っています。その意味では「一時的」に削除ですね。
ただ、じゃあ、manが間違っているのか、というとそうではなく、「env -u」というコマンドを実行している環境内に立場を置いてみると、つまり「env -u 環境変数」というオプションを発行している間だけを見た場合は、指定された環境変数は「ずっと存在しない状態」、つまり「削除された状態」に見えると思います。
env自体が、もともと、どのオプションを指定しても「環境変数をある値に変更して実行」「その環境変数はenvの影響がなくなった後は元に戻る」動きだと思います。それが、manでいう「変更した環境でプログラムを実行する」ということではないでしょうか。
その「ある値」が、「存在しない」という値と同じだった場合、envの環境にある間は「削除」されている状態になる、ということだと思われるのですが。
ちなみに、「-i」オプションは、envの効力がある間は「何も設定されていない状態」、つまり「全ての変数が削除された状態」に変更していますが、envの効力がなくなった後は、やはり元に戻ります。言い方を変えると、「-u」は特定の変数だけ、「-i」は全部の環境変数を、いずれもenvの効力が効いている間だけ「削除」しているのではないでしょうか。
間違っていたらごめんなさい、実行例を実施してみた限りでは、そのように思えます。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-15 10:32
takashi0312  新米   投稿数: 2
pancake さん
返答ありがとうございます。

オプションの効果確認ありがとうございます。
お手数をおかけしました。

コマンドを試せる環境が手元にないので、非常に助かりました。

なるほど。
envコマンドの「削除」の影響範囲ですか。

exportコマンドの影響範囲をより限定的にしたものと考えてみたら納得がいきました。
確か、exportによる環境変数の変更などは、bashの終了後や、別のターミナル等で、
exportした環境変数の参照はできなかった記憶があります。
コマンドの影響が及ぶ範囲を考えれば当然ですね。

うまく言語化できてないですが、
同じように考えれば「pancake」さんの回答内容について理解できました。

早急にコマンドを試せる環境を構築し、試してみたいと思います。
回答ありがとうございました。
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-9-15 11:36 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
お二人とも難しく考えすぎじゃないですかね?

解説の冒頭に
引用:
環境変数を一時的に変更したり、削除したりしてコマンドを実行できるのが、envコマンドです。
とありますし、manの方でも
引用:
env - 変更した環境でプログラムを実行する
とあります。

もっといえば、もともとの英語のマニュアルを見ると
引用:
NAME
env - run a program in a modified environment
(略)
-u, --unset=NAME
remove variable from the environment

★超意訳(わざとmanと違う表現に変えてます):
名前
env - プログラムの実行時環境を変更する
(略)
-u, --unset=NAME
実行時の(シェル、環境)変数を未設定にする
ってあるわけなので、exportがどうとか一時的の範囲がどうとか考えるのではなく、envで環境をいじってプログラムを実行しているので実行時のみ有効な環境設定をすると理解されるのがシンプルかと思いますよ

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.