shell是啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell是啥意思?相关的知识,希望对你有一定的参考价值。
shell是壳的意思,通常为了保护自己的软件源码不被别人窥视,就会给自己的软件加壳。一些病毒和木马为了保护自己不被杀毒软件查出来杀掉,也会加壳。 参考技术A 程序外壳或软件外壳。 参考技术B 贝壳 参考技术CShell 俗称壳,它提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行。
Shell 实际上是一个命令解释器,它通过解释用户输入的命令并把它传输给系统内核去执行。
Shell 有自己的编程语言,它允许用户编写由 shell 命令组成的程序。Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等。
延伸“术语”
时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
在排序算法中,Shell是希尔排序的名称。
基本上shell分两大类:
一:图形界面shell(Graphical User Interface shell 即 GUI shell)
例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。
二:命令行式shell(Command Line Interface shell ,即CLI shell)
例如:
bash / sh / ksh / csh(Unix/linux 系统)
(MS-DOS系统)
cmd.exe/ 命令提示字符(Windows NT 系统)
Windows PowerShell(支援 .NET Framework 技术的 Windows NT 系统)
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者
以shell script(非交互)方式执行。shell
script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell
script是命令行命令简单的组合到一个文件里面。
Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。
交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
shell的类型
在UNIX中主要有:
Bourne shell (包括 sh,ksh,and bash)
Bourne shell ( sh)
Korn shell ( ksh)
Bourne Again shell ( bash)
POSIX shell ( sh)
C shell (包括 csh and tcsh)
C shell ( csh)
TENEX/TOPS C shell ( tcsh)
Bourne Shell
首个重要的标准Unix Shell是1970年底在V7
Unix(AT&T第7版)中引入的,并且以它的创始科技部基础条件平台“国家气象网络计算应用节点建设”(2004DKA50730)资助者
Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和
命令编程语言。Bourne shell 可以运行为login shell或者login
shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login
shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环
境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。
C Shell
Bill Joy于20世纪80年代早期,在伯克利的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。
Korn Shell
有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C
shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C
shell的交互式特性,并融入了Bourne shell的语法。因此,Korn
shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn
Shell
是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性
的标准——在源程序一级跨越多种平台。
Bourne Again Shell (bash)
bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。
POSIX Shell
POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.
各主要操作系统下缺省的shell:
AIX下是Korn Shell.
Solaris缺省的是Bourne shell.
FreeBSD缺省的是C shell
HP-UX缺省的是POSIX shell.
Linux是Bourne Again shell.
Windows PowerShell是
一种新的交互式的命令行和基于任务脚本编写技术,它使信息技术(IT)
管理员能够全面地自动操作和控制系统管理任务,从而提高了管理员的生产力。Windows PowerShell
包括多个系统管理实用工具、一致的语法和命名惯例、及对普通管理数据更好地导航,如登记、证书存储 或 Windows Management
Instrumentation (WMI)。Windows PowerShell 还专门针对 IT 管理,提供直观的脚本编写语言。
Shell也是一个VB函数,它的作用是运行程序,语法是Shell(命令字符串[,窗口类型])
$-#*i 在 shell 脚本中是啥意思?
【中文标题】$-#*i 在 shell 脚本中是啥意思?【英文标题】:What does the $-#*i mean in shell script?$-#*i 在 shell 脚本中是什么意思? 【发布时间】:2017-06-22 20:22:37 【问题描述】:在 CentOS 6 上的文件 /etc/profile
中有一个 for 循环:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "$-#*i" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
上述 for 循环中的$-#*i
是什么意思?
感谢您的帮助。
【问题讨论】:
当我读到标题时,我以为你在那儿删掉了一个 $-#*ing 坏词...... 【参考方案1】:tl;博士:
如果当前 shell 是 交互式,则条件 [ "$-#*i" != "$-" ]
评估为逻辑 true,在这种情况下,退出代码设置为 @987654328 @,表示 true,这会导致执行封闭的 if
语句的 then
分支。
问题中的条件和代码作为一个整体故意仅使用 POSIX-compliant shell-language syntax and commands 以便可移植(与所有可能起作用的 POSIX-兼容 shell 一起使用如/bin/sh
)。
请注意,如果bash
可以假定为外壳,例如,相同的条件可以更易读地表示为[[ $- == *i* ]]
说明
$-#*i
是一个 parameter expansion,它从命名参数 $-
的值中删除与 pattern *i
匹配的最短前缀 (#
)(命名参数通常称为变量)。
$-
是special parameter,其中(添加了链接和重点):
扩展为 当前option 标志(单字母选项名称连接成一个字符串),如调用时指定的,由 set 特殊内置命令, 或由 shell 隐含。
一个交互式 shell隐式将选项标志i
添加到$-
的值;换句话说:$-
的值中存在字母 i
意味着手头的 shell 是交互式的,相反,@987654343 的 不存在 @ 表示 shell 非交互式。
*i
匹配的内容,返回$-
的子字符串(在本例中为后缀)。
换句话说:只有在 interactive shell 中,$-#*i
not 才等于 $-
,因为在 noninteractive shell 中 - 由于不存在i
- 参数展开无作用,两个操作数相等。
问题中的代码的作用作为一个整体:
简而言之:代码使用在/etc/profile.d
中找到的shell 脚本来初始化当前shell;更具体地说:
当前用户 (-r
) 可以读取的目录 /etc/profile.d
中的脚本(名为 *.sh
的文件)按字母顺序一一传递给 .
(dot) utility。 dot 实用程序从 current shell 中的每个文件执行命令,通常用于定义别名、函数和环境变量。这通常称为采购文件。
输出每个源脚本产生的处理方式不同,具体取决于当前 shell 是否是交互式的:
交互式 shell:输出通过(将在交互式 shell 中可见)。
noninteractive shell:输出被抑制(>/dev/null 2>&1
是符合 POSIX 标准的方式来使 stdout 和 stderr 都静音)。
【讨论】:
【参考方案2】:请参阅Unix & Linux 上的top answer 至What does “$-#*i” != “$-” mean? cuonglm:
$-
是 shell 本身在调用时设置的当前选项标志, 或使用set
内置命令:$ echo $- himBH $ set -a $ echo $- ahimBH
"$-#*i"
是删除字符串的语法:(来自POSIX documentation)$参数#[单词]
删除最小前缀模式。该词应扩展为产生 一种模式。然后参数扩展将导致参数, 前缀的最小部分与模式匹配 已删除。
如果存在,单词不应以未引用的“
#
”开头。$参数##[单词]
删除最大前缀模式。该词应扩展为产生一个 图案。然后参数扩展将导致参数,与 与删除的模式匹配的前缀的最大部分。
所以
$-#*i
删除最短的字符串直到第一个i
字符:enter code here $ echo "$-#*i" mBH
在您的情况下,
if [ "$-#*i" != "$-" ]
检查您的外壳是否是 互动与否。
【讨论】:
我已经编辑了您的答案,以正确引用和归属原作者。在帮助中心查看Referencing;建议是“仅引用相关部分”,而不是完整答案。【参考方案3】:$-
表示 shell 标志。
$-#*i
表示 shell 标志减去 *i
的第一个匹配项。
如果这两个不相等,则认为 shell 是交互式的(存在标志 i
)。
【讨论】:
以上是关于shell是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章