Bash 初学


跨平台项目不要使用 bash 命令

unix 下的一种 shell



bash 256颜色索引:
Bit 7 6 5 4 3 2 1 0
Data R R R G G G B B
bash shell 的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如 sed、awk 等等。内部命令是由特殊的文件格式(.def)所实现,如 cd、history、exec 等等。
有两种方法执行shell scripts,一种是新产生一个 shell,然后执行相应的 shell scripts;一种是在当前 shell 下执行,不再启用其他shell(source命令)。
// 文件头部含有 #!/usr/bin/node, 直接在shell(前面不能加sh,加了就是指定解释器) 中执行 ./tem.js(需可执行权限) 时 sh 可以调用node 来执行。
系统调用 exec 是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec 系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
exec 1>tem // 重新设置标准输出, 屏蔽 stdout 和 stderr: command > /dev/null 2>&1
  • I/O 重定向通常与FD有关,shell的 FD 通常为10个,即0~9;
  • 三个常用FD(默认与keyboard、monitor、monitor有关):
  • /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃
说明
0
stdin,标准输入
1
stdout,标准输出
2
stderr,标准错误输出


shell 中传含有通配符的参数推荐用''包含
. 前缀的文件是*nix的隐藏文件
文件夹路径使用/,选项前缀-(全名选项前缀--),#注释
"—" 参数(单独的)用来指示本命令行"选项"参数的结束,所有位于"--"后面的参数代表"文件名"或执行此"文件"需要的"参数"。如:
  • git checkout -- 文件1 文件2 文件3
  • lua -E -- 脚本.lua 参数1 参数2 参数3
TAB 键(已经能确定文件)即可自动补全
: 是一个占位符, 不产生任何输出
nohup(忽略hup信号// setsid 开个不属于终端子进程的进程 // disown -h调度已有job(s))+ & : 忽略终端关闭发送的hup信号后台运行,不过终端关闭之后jobs就看不到进程了,只能通过ps查看。
使用disown命令之后,还有一个问题。那就是,退出 session 以后,如果后台进程与标准I/O有交互,它还是会挂掉。(比如console.log),因为后台任务继承自当前session的标准i/o,disown并没有改变这一点。可以自己改变标准输入输出
subshell:将一个或多个命名包含在"()"中就能让这些命令在子 shell 中运行,将"&"也放入"()"内效果跟setsid命令一样
& "后台"运行(终端关闭就没了),ctrl+z 挂起进程,jobs 得到任务号,用fg %x恢复, bg %x(将一个在后台暂停的命令,变成在后台继续执行);
& 后台运行的进程有 log 输出会自动将进程调到前台来,ctrl+c 不会退出而是推到后台
&& 成功退出后连续执行。; 总是执行后面的命令
|| 仅当左侧出口状态为非零(即 false)时,它才会评估右侧
$ 系统环境变量,如输出PATH:echo $PATH,echo $? 上一条命令运行的错误码(正确为0)
unset 删除环境变量
<> 输入输出重定向命令(命令后面的定向到前面的命令)
| 管道命令(将前面命令的输出作为后一个命令的输入)
- 代表标准输出(跟tee一个意思?),选项/&和-之间可以省略空格,但是参数和-之间不能省略
\ 换行
>> 重定向并追加到文件。如:echo "127.0.0u.com">>hosts
命令替换,将一个命令的输出作为另一个命令的参数 command1 `command2`
ctrl+c 退出进程(发送了系统信号SIGINT?)
ctrl+d 退出××(传递SIGTEM信号,sort wc命令都可以不带参数等待用户输入ctrl+d在处理输入数据)
(cd /root && echo $PWD) 使用子 shell 执行命令,可以指定当前工作目录

--help 显示命令帮助
uname 显示系统信息 // unix name
su 切换用户,ubuntu默认不能切换到root,需要sudo passwd设置root密码
ls列出文件,-a显示所有,-l显示详情,-s显示大小,R递归显示,F文件类型标识
cd 移动工作目录
cp 复制文件 -f 静默覆盖,-r/R:递归复制目录及其子目录内的所有内容
pushd 切换目录(先 pushd 添加到栈,+)
dirs 显示栈目录,-c清除栈
popd 从栈中弹出目录
pwd 当前工作目录(并非脚本执行目录)
mkdir 创建文件夹 -p 创建多层次目录,-m 指定目录权限
rmdir 删除指定空目录,-p指定目录中的多层次空目录
stat 查看文件状态
touch 创建文件或者更新文件状态
mv 移动文件(相同文件夹下用作重命名),-f 强制覆盖,-u更新
rm 删除文件,-d 删除目录,-i 提示,-r 递归删除,-f 强制删除
cat 显示文件内容,-n 显示行号,-b 对空行不编号
head -5 file 看文件的前5行
tail 看尾, 参数 -f/F 使 tail 不停地去读最新的内容
watch 以周期性的方式执行给定的指令,如 watch cat file,输出全屏显示,-n 指定执行间隔,-d 高亮不同之处
uniq:去重后显示文件内容,-c 显示出现次数 -d 仅显示重复行 -u 仅显示没重复行
watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

sed 非交互式处理文件,sed -i 1a\sd tem 在 tem 第一行添加一行 sd,-s 替换
awk 处理文本文件 // '{print $1,$4}' 每行按空格或 TAB 分割,输出文本中的 1、4 项
wc 统计指定文件中的行数(-l)、单词数(-w)、字节数(-c), 并显示出来
sort 排序文件中的行,-o 修改源文件,-r 降序,-u 去除重复行,-n 以数字来排序,-t 分隔符再 -k 制定列数 -f 忽略大小写,-b 忽略空白,-M 按月份(英文)
chmod [-vR] [ugoa] [+-=] [rwx] 修改文件权限,如 sudo chmod a+rwx st
// chmod -x *.pl 添加多个文件执行权限
iconv 转换文件编码,-f,-t 输入输出格式,-o 输出文件夹,-s 关闭警告
which git-shell 查看 git-shell 实际运行的程序位置 // whereis
see 用系统配置文件 /etc/mailcap 或用户配置文件 ~/.mailcap 打开文件,类似的还有 xdg-open(与Nautilus 保持一致)
select-editor // 选择默认播放器。

shell 脚本(先由bash执行)顶部#!指定该脚本内容执行程序
#!/bin/sh
"/D/Program Files/Sublime Text/sublime_text.exe" $1 &
$1获取bash中的参数,&表示非阻塞式的后台运行
mktemp 生成临时文件,返回临时文件绝对路径
trap 命令用来在 Bash 脚本中响应系统信号

bash(shell) 脚本:
不用写行结束符,不能计算浮点
VAR=55 # 将整数55赋值给变量VAR
((++VAR)) #自增
echo $((VAR * 22)) # VAR乘以22并将结果送入命令
... #太复杂了



login故名思义,即登陆,login shell是指用户以非图形化界面或者以ssh登陆到机器上时获得的第一个shell,简单些说就是需要输入用户名和密码的shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。

interactive意为交互式,这也很好理解,interactive shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。所以一般来说只要是需要用户交互的,即一个命令一个命令的输入的 shell都是interactive shell。而如果无需用户交互,它便是non-interactive shell。通常来说如bash script.sh此类执行脚本的命令就会启动一个non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的shell。

  • 登陆机器后的第一个shell:login + interactive
  • 新启动一个shell进程,如运行bash:non-login + interactive
  • 执行脚本,如bash script.sh:non-login + non-interactive
  • 运行头部有如#!/usr/bin/env bash的可执行文件,如./executable:non-login + non-interactive
  • 通过ssh登陆到远程主机:login + interactive
  • 远程执行脚本,如ssh user@remote script.sh:non-login + non-interactive
  • 远程执行脚本,同时请求控制台,如ssh user@remote -t 'echo $PWD':non-login + interactive
  • 在图形化界面中打开terminal:
    Linux上: non-login + interactive
    Mac OS X上: login + interactive
#!/usr/bin/env sh 指定解释器,当bash以是sh命启动时,bash会尽可能的模仿sh(包括配置文件的加载方式)