GNU/Linux >> Linux の 問題 >  >> Linux

〜常に$ homeと等しいですか?

これはおそらく以前に尋ねられたことがあると思いますが、Googleでは見つかりませんでした。

与えられた

  • Linuxカーネル
  • $HOMEを変更する構成はありません
  • バッシュ

〜==$ HOME 本当ですか?

承認された回答:

理解しておくべき重要なことは、 拡張は(一部のシェルの)シェルの機能であり、使用されている場所に関係なくホームディレクトリを意味する魔法のキャラクターではありません。

$ var のように(コマンドラインを解釈するために使用されるアプリケーションであるシェルによって)拡張されます。 コマンドが実行される前にシェルコマンドラインで使用されると、特定の条件下でその値に展開されます。

この機能は、1970年代後半にCシェルに最初に登場し(Bourneシェルにはありませんでしたし、その前身であるThompsonシェルもありませんでした)、後にKornシェル(Bourneシェルに基づいて構築された新しいシェル)に追加されました。 80年代)。最終的にPOSIXによって標準化され、 fishなどの非POSIXシェルを含むほとんどのシェルで使用できるようになりました。 。

シェルで広く使用されているため、シェル以外のアプリケーションの中には、ホームディレクトリを意味するものとして認識しているものもあります。これは、構成ファイルまたは独自のにある多くのアプリケーションの場合です。 コマンドライン( mutt slrn vim …)。

bash 特に(GNUプロジェクトのシェルであり、多くのLinuxベースのオペレーティングシステムで広く使用されています)、 shとして呼び出された場合 、主にに関するPOSIXルールに従います 拡張、およびPOSIXで指定されていない領域では、ほとんどがKornシェル(一部のクローン)のように動作します。

$ var ほとんどの場所で展開されます(一重引用符内を除く)、 後付けである拡張は、いくつかの特定の条件でのみ拡張されます。

これは、文字列が期待されるコンテキストで、リストコンテキストで独自の引数を使用する場合に展開されます。

bashで展開された場所の例をいくつか示します。 :

  • cmd arg〜other arg
  • var =〜
  • var =x:〜:x (POSIXで必要、 PATHなどの変数に使用 、 MANPATH …)
  • for i in〜
  • [[〜=text]]
  • [[text =〜]] の拡張 AT&T kshでパターンとして採用されている ただし、 bashではありません 4.0以降)。
  • case〜in〜)...
  • $ {var#〜} (他のシェルにはありませんが)
  • cmd foo =〜 (ただし、 shとして呼び出された場合はそうではありません 、 =の左側にある場合のみ 引用符で囲まれていないbashのような形をしています 変数名)
  • cmd〜/ x (明らかにPOSIXで必要です)
  • cmd〜:x (ただし、 x:〜:xではありません またはx-〜-x
  • a [〜] =foo; echo "$ {a [〜]} $((a [〜]))" (他のシェルにはありません)

展開されていない例をいくつか示します。

  • echo "〜"'〜'
  • echo[メール保護]~~〜uにも注意してください ユーザーuのホームディレクトリに展開することを目的としています 。
  • echo @〜
  • ((HOME ==〜)) $((var + 〜))
  • extglobを使用 : case $ var in @(〜| other))... (ただし、 case $ var in〜| other) 大丈夫です。
  • ./ configure --prefix =〜-prefixとして は有効な変数名ではありません)
  • cmd "foo" =〜 bash 、引用符のため)。
  • shとして呼び出された場合 : export "foo" =〜 env JAVA_HOME =〜cmd
関連:Debian – dead.letterの不思議な「ホストを解決できません」?

何に拡張されるかについて: 単独でHOMEのコンテンツに展開されます 変数、または設定されていない場合は、アカウントデータベース内の現在のユーザーのホームディレクトリに(POSIXはその動作を未定義のままにするため、拡張機能として)。

ksh88とbashでは注意する必要があります 4.0より前のバージョンでは、チルダ拡張はリストコンテキストでグロビング(ファイル名の生成)を受けました:

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

通常の場合、これは問題にはなりません。

拡張されているため、他の形式の拡張と同じ警告が適用されることに注意してください。

cd ~

$ HOMEの場合は機能しません -で始まります または..が含まれています コンポーネント。したがって、違いが生じる可能性はほとんどありませんが、厳密に言えば、次のように書く必要があります。

cd -P -- ~

または:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

$ HOMEの値をカバーするため -のように 、 +2 …)または単に:

cd

cdとして 引数なしでホームディレクトリに移動します)

他のシェルには、より高度ながあります 拡張。たとえば、 zsh 、あります:

  • 〜4 〜-〜-2 (完了後)ディレクトリスタック( cd を使用した場所)のディレクトリを拡張するために使用されます 前に)。
  • 動的な名前付きディレクトリ 。独自のメカニズムを定義して、〜somethingの方法を決定できます。 拡大中です。

Linux
  1. Windows 10 VMがQEMU-KVMで常に100%のCPU使用率を示すのはなぜですか?

  2. 「exec{fd}/ watchdog」はBashで何をしますか?

  3. .bashrcの目的とそれはどのように機能しますか?

  1. [a-z]がBashの小文字と一致するのはなぜですか?

  2. cat << EOFはbashでどのように機能しますか?

  3. 「bash -c」は何をしますか?

  1. Bashは、どのように呼び出されているかをどのように知っていますか?

  2. Bash(Linux シェル)で Ctrl + V が貼り付けられないのはなぜですか?

  3. bashはどのように「false」をテストしますか?