\h
は、ホスト名に展開されるbashプロンプトのエスケープシーケンスです。どこからホスト名を取得しますか?私のシステムでは、hostname -f
または/etc/hosts
または/etc/hostname
または/etc/sysconfig/network
またはではなく、どこでも見つけることができない値が表示されます。だから私はそれがどこから来ているのだろうかと思っています。私のシステムはCentos 7.4です。私は、UUIDのようなものが格納されている隠された場所があることを知っています。過去に同様の隠されたホスト名のタイプの問題に遭遇したことを思い出していますが、詳細を覚えていません。bashプロンプトのエスケープシーケンスはどこですか hホスト名を取得しますか?
答えて
bash source codeを見ると、に、gethostname(2)という、カーネルからホスト名を取得するPOSIXシステムコールが呼び出されます。
/* It's highly unlikely that this will change. */
if (current_host_name == 0)
{
/* Initialize current_host_name. */
if (gethostname (hostname, 255) < 0)
current_host_name = "??host??";
else
current_host_name = savestring (hostname);
}
これは必ずしも正式な文字列ではありません。カーネルはマシンのネットワークホスト名を実際には知りません。 sethostname(2)に渡されたものを報告します。 uname(2) man pageから引用すると:
一方、[ホスト名]は無意味である:それはいくつかの未定義のネットワークでは、本機の名前を与えますが、通常はマシンが複数のネットワークであり、複数の名前を持ちます。さらに、カーネルはそのようなことを知る方法がないので、ここで何を答えなければならないのかを伝える必要があります。
gethostname(2)のないLinux以外のシステムでは、bashはuname(2)に戻ります。 uname(2)が利用できない場合、単に "unknown"と表示されます。あなたはlib/sh/oslib.c
でそのロジックを見ることができます:ホスト名が変更された場合
#if !defined (HAVE_GETHOSTNAME)
# if defined (HAVE_UNAME)
# include <sys/utsname.h>
int
gethostname (name, namelen)
char *name;
int namelen;
{
int i;
struct utsname ut;
--namelen;
uname (&ut);
i = strlen (ut.nodename) + 1;
strncpy (name, ut.nodename, i < namelen ? i : namelen);
name[namelen] = '\0';
return (0);
}
# else /* !HAVE_UNAME */
int
gethostname (name, namelen)
char *name;
int namelen;
{
strncpy (name, "unknown", namelen);
name[namelen] = '\0';
return 0;
}
# endif /* !HAVE_UNAME */
#endif /* !HAVE_GETHOSTNAME */
\h
は更新されません。この値は、シェルの初期化時に起動時にキャッシュされます。
[[email protected]]$ hostname
malkovich
[[email protected]]$ sudo hostname kaufman
[[email protected]]$ hostname
kaufman
[[email protected]]$ bash
[[email protected]]
(お使いのLinuxディストリビューションのほとんどのパッケージがそうであるように)それはおそらく(ちょうど推測)gethostname(2)システムコール使用しています(すべてのsyscalls(2)がそうであるように、カーネルによって処理され、...)
ところで、GNU bash
がありますfree software;したがって、のソースをダウンロードしてくださいcodeとstudy it;use the source, Luke!およびopen the source moreでお願いします。
さらに興味深いのは、その情報がbash
によってキャッシュされる方法です。すべてのコマンドでgethostname
が呼び出されますか?また、strace(1)を使用して調べることもできます。
はもちろん、フリーソフトウェアのソースコードあなたが興味があるたびに勉強の習慣を取ります。 strace
とgdb
デバッガを使用して、動的な動作を理解してください。
フランスの歌手、G.Bedosは、私たちに語った "ラリベルテNE s'use queのSIのNE s'enのSERTのPAS上"、つまり
あなたがそれを使用しない場合は自由が磨耗します。
フリーソフトウェアのソースコードに
ので、次回、してくださいダイビング(翻訳は私がフランス語ではなく英語のネイティブスピーカーです、私のものです)。 あなたの自由を練習することが重要です、それは何ですかfree software is aboutです。
- 1. 登録者のアドレスをホスト名から取得しますか?
- 2. ANSIエスケープシーケンスを使用してbashでターミナルウィンドウのタイトルを取得する方法は?
- 3. bashスクリプトを使用してリモートインスタンスのホスト名を取得する方法は?
- 4. ラムダ(h、t)の-hは何ですか:(-h、t)は何ですか?ここで
- 5. BIGSQL_HEADのホスト名をプログラムでどのように取得できますか?
- 6. どのようにbashプロンプトをデバッグできますか?
- 7. トゥルーカラーまたは太字のZSHプロンプトでエスケープシーケンスを使用するにはどうすればよいですか?
- 8. PhantomJSからUNIXホスト名を取得
- 9. git bashプロンプトはどうなりましたか?
- 10. Crossbar.ioホスト名を取得するには?
- 11. プログラムで名前ノードのホスト名を取得する方法は?
- 12. BASHでは、関数本体で関数名を取得できますか?
- 13. 電子メールの件名をファイルからbash経由で取得します。
- 14. プライベートLAN上のIPアドレスを解決し、関連するホスト名をbashで取得する方法は?
- 15. ldap接続からDnsホスト名を取得するには?
- 16. OpenMP用の.hファイルはどこで入手できますか?
- 17. ターミネーターのプロンプト/ホスト名(ユーザー@ドメイン)の色をカスタマイズすることは可能ですか?
- 18. セロリーAsyncResultホスト名を取得
- 19. なぜ時々私は悪いホスト名を取得していますか?
- 20. Rubyでホスト名からIPアドレスを取得する
- 21. Powerline-Plain [Bash-it]テーマのプロンプトで色付きのホスト名を表示するにはどうすればいいですか?
- 22. ISPホスト名の取得
- 23. JMenuItemからプロンプトを取得する
- 24. Bashプロンプト短縮
- 25. BASHスクリプト内でgit repo名とgithub usernameを取得しますか?
- 26. ActiveMQのホスト名はどこで手動で設定できますか?
- 27. CのIPv4アドレスからホスト名を取得するにはどうすればよいですか?
- 28. pingからホスト名を取得し、結果をテキストに保存します
- 29. bash Osxのプロンプトを設定しますか?
- 30. Android 2.3.6は証明書のホスト名検証をどこで行いますか?
この質問はStack Exchangeネットワークの[Unix&Linux](http://unix.stackexchange.com/tour)に属しているため、この質問を議論の対象外としています。 – Cyrus
'bash'はUnix以外のシステムでも実行できます。ここで' \ h'エスケープのセマンティクスについて質問するのが妥当です。 – chepner
それで、systemdには、ハードドライブからのホスト名の保存とアクセスを含む独自の 'hostnamectl'というものがあります。 –