Linuxとシェル-シェルは必須ですか?


8

初心者向けの質問です。

Linuxでシェルが必要なのはなぜですか?入力時の例として-find。-name xy *-シェルがこの入力を受け取り、findコマンドを呼び出すと言われました(ワイルドカードが正しく解釈されることなどを確認してください)。シェルの概念なしにこれを行うことはできませんか?...シェルがさまざまなプロセスを追跡している場合、シェルなしでこれを行うことはできませんか?

また、なぜ私は> ls xy *と入力して適切な出力を取得できるのかという理由ですが、*を検索と検索で\でエスケープする必要があります。-name xy \ *シェルは一方のワイルドカード拡張を実行し、もう一方の実行可能ファイルは実行しませんか?

ありがとうございました。

linux  bash  shell 

9
シェルなしでLinuxを使用することは、都市交通を介してフェラーリを50 km / hで運転するようなものです。すべての楽しみがなくなります。
ヴァバ2009

回答:


23

シェルの概念なしにこれを行うことはできませんか?

うーん、ダメ。意図を解釈して適切なプログラムを呼び出すものが必要です。それをシェルと呼びます。

編集:混乱を避けるために、「シェル」は「コマンドラインインターフェース」を意味しません。http://en.wikipedia.org/wiki/Shell_(computing)から:

「オペレーティングシステムシェルは通常、コマンドラインとグラフィカルの2つのカテゴリのいずれかに分類されます。コマンドラインシェルはオペレーティングシステムにコマンドラインインターフェース(CLI)を提供し、グラフィカルシェルはグラフィカルユーザーインターフェース(GUI)を提供します。カテゴリシェルの主な目的は、別のプログラムを起動または「起動」することですが、シェルには、ディレクトリの内容を表示するなどの追加機能が含まれていることがよくあります。

他の質問と同様に、シェルは両方のコマンドに対してワイルドカード拡張を行っていますが、findを使用してファイルを検索しているときに、シェルではなくfindを使用して拡張を実行します。呼び出し元の場所ではなく、したがって、*をエスケープしてシェルが展開を停止し、findがそれを表示できるようにします。


つまり、Windowsではスタートボタンはシェルと呼ばれますか。:-)

5
一般的な使用法ではありませんが、GUIは間違いなくシェルです(少なくともカーネルの外部で実行される場合)。開始ボタンはGUIの機能にすぎません...
dmckee ---元モデレーターの子猫

スタートボタンは間違いなく「あなたの意図を解釈して適切なプログラムを呼び出す」ものです。OTOH、Linuxシェルは、単にTUI(Text User Interface)の機能と呼ぶことができます。

11
@Paul:Explorer、スタートボタンを提供するプログラムはWindowsシェルです。実際には、それはWindowsのシェル。交換できます。
ムーンシャドー

1
はい、開始ボタンはシェルとして見ることができます。インタラクティブなシェルではなく、シェルです。しかし、通常、誰かが「シェル」と言うとき、それらは対話型プロンプトを意味します(たとえば、Windowsのコマンドプロンプトは従来のシェルです)

5

もちろん、GUIを使用してすべてを行うことができます。Windowsのファイルの検索(XP以前のバージョン)は、入力したコマンドと多少似ています。

では、なぜUNIX(およびLinux)ユーザーはシェルが好きなのでしょうか。出力を取得できるため、それを別のプログラムにフィードして、異なる出力を取得します。例えば:

find | grep burek

これらの2つのコマンドあり、findかつgrep、一方が他方を供給する。find現在およびすべての子フォルダ内のすべてのファイルを1行に1つずつリストし、grepを含む行のみを出力しますburek

さて、次のような他のより複雑なものがあります。

ls -R | sort | uniq

ls -R現在のフォルダーと子フォルダー内のファイルを一覧表示しsort、出力を並べ替えます。uniq次に、一意の行のみを指定します。

これですべてをGUIにコーディングできますが、独自に作成しない限り、通常はGUIで実行できないようなトリッキーなことをコマンドラインですばやく実行できます。その場合は、コマンドラインに入力する方が高速ですよね。

結論:これを尋ねても、それは必要ありません。コマンドラインは、通常のユーザーとしては役に立ちません。ただし、コマンドラインは、システム管理者、開発者、およびコンピューターをいじくり回したい人には非常に便利です。


1

はい、シェルなしでfindコマンドを実行できます。ただし、コマンドを起動するには何らかのプログラムが必要であり、出力を表示するには何らかのプログラムが必要です。多くの場合、シェルの機能を使用しており、そのコマンドはインテントを解釈するためにシェルを必要とします。

たとえば、パイプ、リダイレクト、グロビングはシェルの機能であり、解釈するにはシェルが必要になります。「find。-name myfile」はシェルの機能を使用せず、シェルなしで実行できます。"find。-name myfile | sort> output"は、パイピングとリダイレクトの両方を使用し、それを解釈するにはシェルが必要です。

xy *のエスケープに関しては、それが検索する入力であるか、レディクションの出力である場合、シェルはどちらの方法でもそれを展開します。

現在のディレクトリにxyzという名前のファイルがある場合

見つける -name xy *は実際にはfindとして実行されます。-name xyz、これはおそらくあなたが望むものではありません。

あなたが見つけた場合。-name xy *であり、現在のディレクトリにxy *に一致するファイルがない場合は、findとして実行されます。-name xy *。

同様に、現在のディレクトリにxy *に一致するファイルがない場合、ls> xy *はxy *という名前のファイルを作成します。一致するファイルが1つある場合-たとえば、xyzは、ls> xyzを意味します。xy *に一致するファイルが複数ある場合、ls> xy *は失敗します。

続きを読むhttp://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html


読み取りモードはどこですか?
Thomi

1

重要なOS 、カーネルでコマンドラインインタープリターを実行しません

彼らはそれをプログラムとして実行し、そのプログラムが呼び出されるシェル。GUIの状況は複雑なようですが、少なくとも一部のOSはカーネルの外部でも実行されます。

これで、シェルがunixシェルのように機能する必要はまったくありませが、インターフェース必要です。


1

2番目の質問に答える...シェルは、ユーザーがそれを防止しない限り、可能な限り何でも拡張しようとします。*をエスケープすると、展開が妨げられます。これは、通常、findコマンドに必要です。

質問に答えるのではなく、コマンドラインの拡張が原因でlsコマンドがファイルを一覧表示していたのか、またはlsコマンドがファイルシステムからディレクトリ一覧を合法的に検索したのかをどうやって知るのでしょうか。たとえば、次のようにループforシェルを記述できます。

for i in $(ls /home/mydir);

またはのように

for i in /home/mydir/*;

それらは最終的に同じセットになります。


0
> ls xy *と入力して適切な出力を取得できるのはなぜですか
*をfind-findの\でエスケープする必要があります。-name xy \ *は
ワイルドカード拡張を行うシェルであり、
他の実行可能ファイル?

find呼び出しで「*」をエスケープする目的は、シェルが展開を行わないようにすることです。エスケープすることで、findが引数「。」、「-name」、「xy *」を参照できるようになります。「*」をエスケープしなかった場合、findは「。」、「-name」、「xya」、「xyz」を表示します(シェルが「xy *」を「xya xyz」に展開すると仮定します。これは、 xyで始まるファイルはxyaとxyzです。だからあなたの質問への答えはノーです、あなたがそれをエスケープすることによって明示的にそれをしないようにあなたに要求したので、シェルはfindの呼び出しで '*'を展開しません。


0

Linuxのシェルは、Linuxのファイルシステムとやり取りし、引数と環境変数に関してコマンドを実行する便利で従来の方法です。たとえば、1つのプロセスの出力を他のプロセスの入力に接続したり、入出力ストリームをファイルやFIFOに転送したり、リダイレクトしたりできます。シェルは、それぞれの小さなプログラムを簡単に組み合わせるための良い方法です有用な何かを提供するために、比較的小さなタスクを実行します。これらのプログラムの一部(findやlsなど)は、それらをシェルで操作するように設計されています。

展開を理解するには、単に単語(aplhanumeric文字のスペースで区切られたシーケンスとすることを覚えて-、それが含まれている与えられた、といくつかの他の記号)、*または?パターン文字は、エスケープや引用符(内側に置かれていない")、またはアポストロフィ'、シリーズで置換されていますパターンに一致するファイル名を持つスペース区切りの単語の組み合わせ。つまり、アスタリスクが付いた1つの単語があった場合、展開後は0、1、またはいくつかの単語が得られ、bashによっていくつかの引数として扱われます。ここでは、lsコマンドの特定のデザインが登場ls foo*します。「foo」で始まるすべてのファイルを表示するために使用すると、このスキームに完全に適合します。それは次のようなものに拡張されます

ls foobar boobaz

lsは、引数からファイルを出力し、存在を確認してフォルダに移動します。

しかし、それは主に哲学の問題です。他のシステムでは、すべてが「スタート」ボタンとタスクバーから現れます。一部のユーザーはそれで大丈夫です。そのようなシステムにLinuxのようなシェルをインストールしようとする人もいます。それは好みの問題ですが、ファイルを扱う単純なスクリプトをプログラミングする場合、シェルは非常に便利です。


0

対話型コマンドの場合、シェルはGUIに置き換えられます。

しかし、シェルの重要な点は、それがスクリプト言語であることです。特定の状況(ブート、セッションの開始、毎日など)で実行されるプログラム全体を作成できます。この機能を他のツールで置き換えることはできません。


そしてもちろん、次のcron
コマンドで

0

もちろん、Linuxを実行してシェルを使用することはできません。箱から出したばかりの多くの標準Linuxディストリビューションは、facebookを確認し、写真を見て、電子メールを送信したいだけの場合に、ホームユーザーに必要なものを提供します。

Linuxには多くの長所がありますが、おそらくシェルが最高です。シェルでは、I / Oリダイレクトが可能です。これは、パイプ( "|")を参照するときに人々が話していることです。例えば:

マシンのリストに接続して、ユーザーアカウントが存在する場所の調査を実行したい:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

hostnames.txtにホストが0個あるか、数千個ある可能性があります。このスクリプトは、調査を行い、情報をstdoutに吐き出します。

スクリプトは非常に独創的になる可能性があります。「/ >>」文字を使用して、ファイルの入出力をリダイレクトできます。上記のスクリプトでこれらすべてのマシンを調査し、ユーザーがいるサーバーの名前をファイルに出力してから、ユーザーアカウントに接続していくつかのタスクを実行する別のスクリプトをフォローアップできます(lock / unlock / reset pw /グループの削除/追加など)。

学ぶ。に。脚本。=)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.