Linux和Shell-Shell是必须的吗?


8

一个总的新手问题。

为什么在Linux中需要外壳程序?例如,当我键入-find时。-name xy *-有人告诉我shell接受此输入并调用find命令(确保正确解释了通配符及所有其他内容)。如果没有shell的概念,就不能做到这一点吗?...如果shell跟踪各种过程,那么没有它就不能完成吗?

另外,为什么我可以键入> ls xy *并获得正确的输出,而我需要在find-find中使用\进行转义。-name xy \ * Shell是否为一个可执行文件而不是另一个可执行文件进行通配符扩展?

谢谢。

linux  bash  shell 

9
使用没有外壳的Linux就像在城市交通中以每小时50公里的速度驾驶法拉利。所有的乐趣都会消失。
vava

Answers:


23

没有外壳的概念就无法做到吗?

好吧,不。您需要一些东西来解释您的意图并调用适当的程序。那东西叫做贝壳。

编辑:为避免混淆,“ shell”并不表示“命令行界面”。从http://en.wikipedia.org/wiki/Shell_(计算)

“操作系统外壳通常分为两类之一:命令行和图形。命令行外壳为操作系统提供命令行界面(CLI),而图形外壳则提供图形用户界面(GUI)。类别shell的主要目的是调用或“启动”另一个程序;但是,shell经常具有其他功能,例如查看目录内容。

至于您的另一个问题,外壳程序正在对这两个命令进行通配符扩展,但是当您使用find搜索文件时,您要查找而不是外壳程序进行扩展,因为您希望在位置find进行查找在而不是从中调用它的位置;因此,您可以逃脱*来停止外壳扩展它,以便find可以看到它。


因此,您说Windows中的“开始”按钮称为外壳程序吗?:-)

5
这不是很常见的用法,但是GUI可以说是外壳程序(至少如果它们在内核之外运行)。“开始”按钮只是GUI的功能...
dmckee ---前主持人小猫

“开始”按钮绝对是“解释您的意图并调用适当程序的东西”。OTOH,Linux shell可以称为TUI(文本用户界面)的功能。

11
@Paul:资源管理器,提供开始按钮的程序是Windows Shell。事实上,这是一个 Windows外壳; 可以更换。
moonshadow

1
是的,开始按钮可以看作是外壳。仍然不是交互式外壳,而是外壳。不过,通常情况下,当有人说“ shell”时,它们是指交互式提示(例如,Windows上的命令提示是传统的shell)

5

您当然可以通过GUI进行所有操作。Windows的“查找文件”(来自XP和更早版本)在某种程度上类似于您键入的命令的GUIsh。

现在,为什么UNIX(和Linux)用户喜欢shell?因为您可以获取输出,所以将其输入另一个程序,然后获得不同的输出。例如:

find | grep burek

这是两个命令,findgrep,一个提供另一个。find列出当前文件夹和所有子文件夹中的所有文件,每行列出一个,并grep仅打印出包含的行burek

现在,还有其他更复杂的事情,例如:

ls -R | sort | uniq

ls -R列出当前文件夹和子文件夹中的文件,并对sort输出进行排序。uniq然后只给我们唯一的线条。

现在,尽管您可以将所有这些代码编写到GUI中,但是您可以使用命令行快速完成这些棘手的工作,除非您自己编写,否则通常无法使用GUI进行操作。在这种情况下,只需将其键入命令行即可,不是吗?

底线:如果您提出这个问题,则不需要它。命令行对于您作为普通用户是没有用的。但是,命令行对于系统管理员,开发人员以及想要以快速,快速的方式弄乱计算机的人来说非常有用。


1

是的,您可以在没有外壳的情况下运行find命令-但是您需要一些程序来启动它,并且需要一些程序来显示它的输出。很多时候,您正在使用外壳程序的功能,并且该命令将需要外壳程序来解释意图。

例如,管道,重定向和globing是shell的功能,并且需要shell进行解释。“ find。-name myfile”不使用外壳程序的任何功能,并且可以在没有外壳程序的情况下运行。“ find。-name myfile | sort> output”同时使用管道和重定向,您需要一个Shell来解释它。

至于转义xy *,如果是要查找的输入或预测的输出,则几乎没有区别,shell会以任何一种方式对其进行扩展。

如果当前目录中有一个名为xyz的文件

找 。名称xy *实际上将作为find运行。-name xyz,可能不是您想要的。

如果找到的话。-name xy *并且当前目录中没有与xy *匹配的文件,它将以find的形式运行。-名称xy *。

同样,如果当前目录中没有与xy *匹配的文件,则ls> xy *将创建一个名为xy *的文件。如果有一个文件匹配-说xyz,则表示ls> xyz。如果有多个文件匹配xy *,则ls> xy *将失败。

阅读更多http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html


阅读模式在哪里?
Thomi

1

普通操作系统不会在内核中运行命令行解释器。

他们运行它的程序,并且该程序被称为一个壳。GUI上的情况似乎好坏参半,但至少有些操作系统也在内核之外运行。

现在,绝对不需要外壳程序像unix外壳程序那样工作,但是您确实需要一个接口。


1

要回答您的第二个问题...除非您阻止,否则外壳将尝试尽可能扩展它。转义*会阻止扩展,这通常是find命令所必需的。

不回答一个问题,您怎么知道ls命令是由于命令行扩展而列出文件,还是因为ls命令从文件系统中合法地查找目录列表?例如,我可以为这样的循环编写一个shell:

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

或喜欢

for i in /home/mydir/*;

它们最终导致相同的集合。


0
为什么我可以输入> ls xy *并获得正确的输出,而
我需要在find-find中使用\来转义*。-name xy \ *是
外壳为一个而不是为一个做通配符扩展
其他可执行文件?

在find调用中转义'*'的目的是防止shell进行扩展。通过转义,可以确保find看到以下参数:“。”,“-name”,“ xy *”。如果您未转义'*',则查找将看到“。”,“-name”,“ xya”,“ xyz”(假设外壳将“ xy *”扩展为“ xya xyz”,如果唯一以xy开头的文件是xya和xyz)。因此,您的问题的答案是否定的,shell不会在find调用中扩展“ *”,因为您明确要求不要转义它。


0

Linux中的Shell是一种方便且常规的方式,可以与Linux中的文件系统进行交互,并运行带有参数和环境变量的命令。它提供了许多有用的功能,例如,将一个进程的输出连接到其他进程的输入,将输入/输出流重定向到文件,FIFO或从文件,FIFO等重定向。外壳程序是轻松组合多个小程序的好方法,每个小程序做一个相对较小的任务,提供有用的东西。其中某些程序(例如find和ls)是为在shell中使用它们而设计的。

要理解扩展,只需记住一个单词(带空格的字母数字字符和-,以及一些其他符号),如果包含*或包含?模式字符,则不会被转义或放在引号(")或撇号内',而是用一系列替换以空格分隔的单词,其文件名与模式匹配。因此,如果您有一个带星号的单词,扩展后将有零个,一个或几个单词,bash会将其视为几个参数。这是ls命令的特定设计:当用于ls foo*显示所有以“ foo”开头的文件时,它非常适合此方案!它被扩展为类似

ls foobar boobaz

ls只是从参数中打印文件,检查是否存在并遍历到文件夹等。

但这主要是哲学问题。在其他系统中,所有内容都从“开始”按钮和任务栏出现。一些用户对此表示满意。有些人试图在此类系统中安装类似linux的外壳。这是一个问题,但是对于编程处理文件的简单脚本而言,shell非常方便。


0

对于交互式命令,可以用GUI替换shell。

但是shell的关键是它是一种脚本语言:您可以创建在特定情况下(引导,会话打开,每天...)执行的整个程序。此功能不能用其他工具代替。


当然,您可以使用cron
Wuffers 2010年

0

当然,您可以运行Linux而从不使用Shell。许多标准的Linux发行版都为家庭用户提供了开箱即用的功能,如果他们只是想查看Facebook,查看图片并发送电子邮件,则可以满足他们的需求。

Linux有很多优点,但是shell可能是最好的。该外壳允许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。

脚本可以变得很有创意。我可以使用“ / >>”字符在文件之间重定向输入/输出。我可以检查上面脚本中的所有那些计算机,将拥有用户的服务器中的服务器名称输出到文件中,然后继续执行另一个脚本,该脚本连接并执行用户帐户上的某些任务(锁定/解锁/重置密码/删除/添加组/等)。

学习。至。脚本。=)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.