Shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Shell 环境
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序,且这个指定路径只能放在文件的第一行。(参考)
终端、shell、bash的区别联系
-
终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多。
-
shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是Shell,登陆终端可以是登陆了Bash也可能是Csh或者Dash;是操作系统与用户交互用的接口,在命令终端里可以使用shell。shell将用户输入翻译为操作系统能处理的指令。shell提供了一些内置命令,也支持调用外面工具。
-
dash,是ubuntu里默认的shell。shell有好多种,除支持默认的POSIX标准外还支持不同的扩展语法,目前最常用的是bash,很多shell学习的教程都是针对bash的。dash除了不支持数组外,其实和bash差别也不大。ubuntu里可以将默认shell由dash改为bash。
gnome-terminal技巧
基本用法:
"gnome-terminal的基本用法"
gnome-terminal --maximize #gnome-terminal命令用于打开一个新的终端,maximize:打开后自动最大化,full-screen:全屏
sleep 5 #睡眠5s
gnome-terminal --window --window #打开两个终端
sleep 5
gnome-terminal --window --tab --window --tab --tab #打开两个,第一个两个tab,第二个3个tab
sleep 5
启动后自动执行命令:
有两个参数可以实现这个功能,-e和-x,这两个区别在于:
-e 可以出现多次,如果在所有--window前面,表示对所有window和tab起作用,如果在--window或者--tab后面,表示只针对这个tab执行,要注意-e后面只能有一个参数也就是说如果有空格,需要用引号
-x 只能出现一次,在-x后面的所有内容,均认为是要执行的命令,所以可以出现空格这些命令是针对所有tab都执行的
比如:
gnome-terminal -e ls
gnome-terminal -x ls
这两个的执行结果都一样,就是新的终端闪一下就没了,有几种办法:
① 修改terminal的配置,在terminal点右键,选择Profiles->Profile Preferences然后找到Title and Command,里面有一项When command exits,后面选择为Hold the terminal open,然后就可以了
②把结果重定向给less,这样less执行完之前,是不会退出的:
gnome-terminal -x ls|less
③在bash里面再启用一个bash
gnome-terminal -x bash -c "ls; exec bash"
gnome-terminal -e 'bash -c "ls; exec bash"'
注意最后一个命令是exec bash,如果直接写bash也行,相当于开了一个子shell,这样有个缺点,就是直接按关闭按钮的话,会提示还有程序在运行。[参考]
这里个人的理解就是在新开的终端中再启动一个bash线程,所以有:gnome-terminal -x bash 然后后面的-c表示清空命令历史[参考],后面表示和这个子线程要执行的命令:ls,最后退出这这个子bash:exec bash。
exec是用被执行的命令行替换掉当前的shell进程,且exec命令后的其他命令将不再执行。例如在当前shell中执行 exec ls 表示执行ls这条命令来替换当前的shell,即为执行完后会退出当前shell。为了避免这个结果的影响,一般将exec命令放到一个shell脚本中,用主脚本调用这个脚本,调用处可以用bash xx.sh(xx.sh为存放exec命令的脚本)。这样会为xx.sh建立一个子shell去执行,当执行exec后该子脚本进程就被替换成相应的exec的命令。[参考]