対話型/非対話型シェルとログイン/非ログインシェルの違いは知っていますが、実際にはスクリプトのようなものがない限り、非対話型ログインシェルになることはないようです/bin/bash --login some-script.sh(さらには少し奇妙な)。これは正しいですか、それともより一般的ですか?
対話型/非対話型シェルとログイン/非ログインシェルの違いは知っていますが、実際にはスクリプトのようなものがない限り、非対話型ログインシェルになることはないようです/bin/bash --login some-script.sh(さらには少し奇妙な)。これは正しいですか、それともより一般的ですか?
回答:
マンページの「呼び出し」セクションで説明されているように、Bashのログイン対非ログインおよび対話型対非対話型のBashシェルの概念について話していると思います。(これは、ファイル内の「シェル」(またはユーザーコマンドインタープリター)として使用される任意のコマンドのJames Youngmanの回答の解釈と、passwd(5)そのプログラムがユーザー入力を受け入れるかどうかとは異なります/usr/sbin/nologin。 )
/bin/bash --login some-script.sh非対話型ログインBash呼び出しを生成するのは正しいことであり、これはおそらく病理学的な例です。非対話型のログインシェルを生成する1つのケースがありますssh somehost < some-file。ここでsshdは、実行するコマンドが与えられていないため、Bashをargv[0]setで起動し、Bash -bashはログインシェルと見なしますが、stdinは端末に接続されていないため、Bashは対話モードに設定され$-ません(を含まないi) 。
(個人的には、この場合は逆の場合よりもはるかに合理的であると思われssh somehost somecommandますsomehost。これは、上記とまったく同じように新しいログインであっても、「ログインシェル」とは見なされません。)
私は最近、私がずっと前にすべきだったことをし、Bashのモードと実行される初期化ファイルの表をまとめました。わかりにくい場合は、少なくとも私も同じように気をつけてください。それは、彼らが本来の目的がいつ.bashrc実行されるかについてのルールにあったものであるかを私に迷惑をかけます。
実際に、新しくインストールされたシステムでは、ほとんどのログインシェルは非対話型です。
$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c
5 /bin/bash
23 /bin/false
1 /bin/sh
1 /bin/sync
17 /usr/sbin/nologin
明らかに/bin/bash、/bin/sh伝統的なシェルであり、それらはインタラクティブです。ただし、そのリストの他のすべてのアイテムは非インタラクティブです。リストを読んでいて、そのうちの1つが何をするのかわからない場合は、そのマニュアルページを(たとえばman nologinまたはでman sync)調べることができます。
コマンドが実際に行うこと
Captain Manの投稿履歴を見ると、彼らはUnixにかなり慣れていないことがわかります。したがって、単に出力ではなく、回答の先頭にあるコマンドラインに関連していないというコメントの質問があります。そのため、コマンドラインについても説明しますが、それはこの質問では本当に話題外です。
コマンドはUnixパイプラインです。パイプラインはコマンドのチェーンです-左から右に読む-最初のコマンドの出力は2番目のコマンドの入力になり、2番目の出力は3番目の入力になります。パイプラインの終わり。最後のプロセスの出力は、端末に表示されます(リダイレクトされていない限り)。詳細については、シェルパイプラインに関するWikipediaのエントリを参照してください。
パイプラインが何をしているのかわからない場合は、セグメントで単純に実行して、何が起こっているかを確認できます。また、使用されているコマンドのマニュアルページを読むこともできます(ここではawk、sortおよびuniq)。実際、今すぐそれを行う必要があります。待ちます。
パイプラインの段階をインクリメンタルに実行してみましょう(独自のUnixシステムで安全に実行できます)。
~$ awk -F: '{print $7}' < /etc/passwd | sed -e 's/^/ /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]
上記の出力は、/etc/passwdファイルの7番目のフィールドの内容です。それは、すべてのユーザーのログインシェルが何であるかをシステムに伝える(フラットテキストファイル)データベースです。もっと知りたい場合は、それを/etc/passwd読んで(世界中で読める)、マニュアルページを見てください(man 5 passwd)。
リスト全体を読むと、人気のあるアイテムが何であるかを知ることができますが、それはこの質問への回答には適した形式ではありません。それらを数えましょう。これを行う最も簡単な方法は、最初にアイテムを並べ替えることです。
~$ awk -F: '{print $7}' < /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]
プログラムuniqを使用して、一意のアイテムのみを表示できます。
〜$ awk -F: '{print $ 7}' </ etc / passwd | 並べ替える| ユニック| sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin
しかし、待って、それは役に立たない、それぞれがいくつあったのか?質問しましょうuniq(manページを読んでください!):
~$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c
5 /bin/bash
23 /bin/false
1 /bin/sh
1 /bin/sync
17 /usr/sbin/nologin
もちろん、これが答えの一番上にある出力です。もう一度並べ替えて、エントリを順番に確認します。
~$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c | sort
17 /usr/sbin/nologin
1 /bin/sh
1 /bin/sync
23 /bin/false
5 /bin/bash
ちなみに、17は1の前にあり、5は23の後にあります。問題は、アイテムが辞書式にソートされていることです。sortそれらを数値的に、逆の順序で並べ替えてみましょう:
~$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c | sort -n -r
23 /bin/false
17 /usr/sbin/nologin
5 /bin/bash
1 /bin/sync
1 /bin/sh
私はそれが元の答えのすべてを説明すると思う。これらのコマンドの機能の詳細がまだ不明な場合は、マニュアルページをご覧ください。何が起こっているかの原則がまだ不明な場合は、UnixとLinuxについて説明している本(オンラインまたは紙)を読むことから始める方が良いかもしれません。
/bin/syncシェルは?どのユーティリティもシェルですか?
bash --loginが質問に明示的に書いていることを考えるとbash、iオプションが設定されていないプロセスについて具体的に尋ねているのかもしれません。(これらはBashのマンページのINVOCATIONセクションでssh somehost < script.sh指定された意味での「ログイン、非対話型」シェルなどのコマンドから発生します。)
telnet towel.blinkenlights.nl非対話型のログインシェルの場合;-)