Shell:
什么是shell:
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本:
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但shell 和 shell script 是两个不同的概念
Ps:1.不同 shell 的命令有所区别,使用时候需要注意。
2.网上的教程通常都是以 bash 作为学习的标准。
3.由于 第1点,使用命令时候如果不清楚,先查询内置的命令帮助文档。(如: COMMAND -h 或者 man COMMAND 等 )
4.善用 tab 键的自动补充功能, COOMAND -(tab键,列出所有参数)
例如:
bash 中有 help 命令, history 命令有 -c 参数
zsh 5.8 中是没有 help 命令, 并且 history 命令也没有 -c 参数
查看shell版本的几种方式:1. shell --version, 例如: zsh --verison 或者 bash --verison
2. $SHELL_VERSION, 例如: $ZSH_VERSION, 这里好像只有 zsh 有个这个
Linux/MacOS 命令:
注意,因为有些命令在 Linux 中有 MacOS 没有,网上找到的有时候比较模糊,所以不一定完全正确,我尽量区分不同的。
符号的含义:符号含义|管道符
&&代表 and 同时运行多个命令, 使用它。
\允许您在新行中继续编写命令 Bash语法。
*匹配路径下,所有文件或者文件夹名称
<< EOF [重定向文件] ...内容 EOF分界符, EOF 不一定是 它,只是通常用它作为分界符标识 ; 结合cat进行内容的追加
>获取命令的标准输出并将其重定向到一个文件中(将覆盖整个文件)
2>获取命令的错误输出并将其重定向到一个文件中(将覆盖整个文件)
&>获取命令的标准和错误输出并将其重定向到一个文件中(将覆盖整个文件)
>>将文本或命令标准输出追加到文件的最后一行
2>>将文本或命令错误输出追加到文件的最后一行
&>>将文本或命令标准和错误输出追加到文件的最后一行
花括号扩展:
在传统的 shell 中是没有 花括号扩展这个功能的.$ echo a{p,c,d,b}e
# 输出结果: ape ace ade abe
$ echo {a,b,c}{d,e,f}
# 输出结果: ad ae af bd be bf cd ce cf
$ ls *.{jpg,jpeg,png}
# 首先扩展为*.jpg *.jpeg *.png,然后解析通配符
当花括号扩展和变量扩展一起使用时,变量扩展解析于花括号扩展之后。有时有必要使用内置的 eval 函数:$ start=1; end=10
$ echo {$start..$end} # 由于解析顺序,无法得到想要的结果
# 输出结果: {1..10}
$ eval echo {$start..$end} # 首先进行变量扩展的解析
# 输出结果: 1 2 3 4 5 6 7 8 9 10
bash 中 ``, '', "" 区别:
首先它们都可以用来解决bash 中字符串中的空格问题。字符串引号描述''原样输出字符串,当我们需要原样输出字符串的时候使用, 例如: a=1; echo '$a' // $a
""参数替换, 例如: a=1; echo "$a" // 1
``命令替换和参数替换, 例如: echo seq 1 10; 主要是为了命令替换, 如果只替换了参数,echo 输出的时候会提示找不到命令.echo `seq 1 10`
# 输出结果: 1 2 3 4 5 6 7 8 9 10
echo seq 1 10
# 输出结果: seq 1 10
bash 中的循环:
格式:# f 变量名
# * 当前文件夹下的所有文件, 这个是 glob 模式
# 循环输出文件
for f in *; do
....
# file f
done# i 变量名
# `seq 1 10` 1 到 10, seq 1 10 是生成1 到 10,但是这里要加上 ``,否则输出的是 seq 1 10
# 循环输出 i
for i in `seq 1 10`; do
....
echo $i
done
# 1
# 2
.
.
.
# 10
bash 中的变量:
下面的例子以下面这个变量为例子:str="这是一个字符串变量"
变量赋值格式:
name=value
Ps:
1. = 与 name 和 value 之间不能有空格;
2.变量的值如果有空格,必须用引号包含
使用变量格式: $str /// 这是一个字符串变量
在 "" 字符串中使用变量, 获取到变量值: "$str" /// 结果是 这是一个字符串变量
在 '' 字符串中使用变量, 获取到: '$str' /// 结果是 $straa=123
#定义变量aa的值是123
aa="$aa"456
#重复定义变量aa的值是源aa的值加上456
echo $aa
# 输出结果: 123456
#aa的值已经变成了123456
aa=${aa}789
echo $aa
# 输出结果: 123456789
# 在进行变量叠加时也可以使用${变量名}格式
# 在进行变量叠加时,变量名需要用双引号或 ${} 包含
变量查看:
set 命令可以用来查看系统中的所有变量(用户自定义变量和环境变量)和设定 Shell 的执行环境
1.直接set命令列出来所有变量
2.为了查找变量是否存在使用 grep 命令:
set | grep -e 正则表达式
变量删除:
unset 命令删除变量: unset str
因为是删除变量,所以不需要带 $
bash 中的字符串操作:
下面的例子以下面这个变量为例子:str=123asd456
字符串按位置截取:
格式:
${var:offset:length}var: 变量,不需要带 $
offset: 从字符串第几个开始截取
length: 长度
如果只有1个参数,正数的时候,为offset, 负数的时候为 length(这里 : 和 - 要有空格)~ % str=123asd456
~ % echo ${str:2:4}
3asd
~ % echo ${str:4}
sd456
~ % echo ${str:-4}
123asd456
~ % echo ${str: -4}
d456
字符串删除:
pattern是glob风格的正则(名称: glob 模式 \ glob 模式匹配)${var/pattern} -- 删除首次。删除var表示的字符串中第一次被pattern匹配到的字符串.
${var//pattern} -- 删除全部。删除var表示的字符串中所有被pattern匹配到的字符串.
${var/#pattern} -- 删除行首。删除var表示的字符串中所有以pattern为行首匹配到的字符串.
${var/%pattern} -- 删除行尾。删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串.
字符串切片:
有点像字符串删除(删除行首或行尾)
格式:${var#pattern} -- 功能:自左而右,查找var变量所存储的字符串中,第一次出现的pattern,删除pattern所匹配到的所有字符。 注意:匹配到的必须是从行首开始的,不能匹配中间某段.
${var##pattern} -- 贪婪模式,匹配到不能再匹配到位置.
${var%pattern} -- 功能:自右而左,查找var变量所存储的字符串中,第一次出现的pattern,删除pattern所匹配到的所有字符。 注意:匹配到的必须是从行尾开始的,不能匹配中间某段.
${var%%pattern} -- 贪婪模式,匹配到不能再匹配到位置.
字符串替换:
pattern是glob风格的正则(名称: glob 模式 \ glob 模式匹配)
格式:${var/pattern/substr} -- 首次。查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之.
${var//pattern/substr} -- 全部。查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之.
${var/#pattern/substr} -- 行首。查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之.
${var/%pattern/substr} -- 行尾。查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之.
输出PATH换行:echo ${PATH//:/\\n}
字符大小写转换:${var^^} :把var中的所有小写字母转换为大写.
${var,,} :把var中的所有大写字母转换为小写.
变量赋值:
格式:${var:-VALUE}:如果变量var为空或者未设置,则返回VALUE;否则返回变量var的值。注意,变量name本身的值不会被修改.
${var:=VALUE}:如果变量var为空或者未设置,则返回VALUE,并将VALUE赋值给变量var;否则返回变量var的值.
${var:+VALUE}:如果变量为空或者未设置,那么不会返回任何值。否则返回VALUE的值。注意,变量name本身的值不会被修改.
${var:?ERROR_INFO}:如果变量var为空或者未设置,则返回错误信息ERROR_INFO;否则返回变量var的值.
命令:
source:
在当前 shell 环境下读取并执行FileName中的命令。
*注:source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。该命令通常用命令“.”来替代
格式:source filename
. filename(中间有空格)
compgen:
列出所有命令参数描述-c列出所有可用的命令
-a列出可用的所有alias
-b显示所有 shell 内置命令
-k显示所有 shell 关键字
-A显示所有 shell 函数
alias:
alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误。
alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中
执行 alias 或者 alias -p, 可以显示自己设定的 alias 命令列表(有些shell 没有 -p 参数,直接执行 alias)
seq:
快速生成数字列表,seq 仅适用数字.# 除非另有指定,否则 `seq` 始终以 1 开头
echo `seq 3`
# 1 2 3
echo `seq 3 6`
# 3 4 5 6指定增量# 3 开始的数
# 4 指定增量
# 20 最大的数,因为19 增量 4 后是大于 20,所以最后输出20
echo `seq 3 4 20`
# 3 7 11 15 19
指定减量# 20 开始的数
# -4 指定减量
# 3 最小的数,因为4 减量 4 后是小于 3,所以最后输出3
echo `seq 20 -4 3`
# 20 16 12 8 4使用分隔符 -s参数 加上分隔符
{a..b}:
a是开始,b是结束; 快速生成序列,适用于任何字符(中文也适合).
运算:
bc:
bc 命令是任意精度计算器语言,通常在linux下当计算器用。
它类似基本的计算器, 使用这个计算器可以做基本的数学运算加法
减法
乘法
/ 除法
^ 指数
% 余数# scale 设置小数位,通过 / 1 进行
echo 'scale=2; (2.777 - 1.4704)/1' | bc
# 结果: 1.30, floor
let:
用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来
格式:let arg [arg ...]
例如:$ a=1 b=2
$ let a=a+4 b++
$ echo $a $b
# 结果: 5 3
命令帮助:
内部命令本身一开机就会随bash加载到内存中
而外部命令只会运行后才会加载到内存中可以用hash命令看到
内部命令:
1.通过 help COMMAND 或者 man COMMAND查看命令帮助
2.如果 man COMMAND 看到的是 shell 的命令帮助,就使用help.
外部命令:
1.通常是 COMMAND -h 或者 -—help
2.man COMMAND 或者 info COMMAND
用户与权限:
用户chown:
chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令
格式:chown [-cfhvR] [--help] [--version] [user][:group] file...
例子:# 处理当前目录下的所有文件夹和文件
# ':' 前面的 $(whoami) 是 要设置的拥有者用户是谁,$(whoami)输出当前登录用户
# ':' 后面的是 要设置的 群体的使用者
# * 匹配当前目录的所有
$ chown -R $(whoami):amdin *
# 只改变 关联组,不改变所有者
$ chown :512 ./Readme.md
参数:参数描述-R处理指定目录以及其子目录下的所有文件
user新的文件拥有者的用户 ID 或者用户名
group新的文件拥有者的使用者组(group) 使用者组id 或者 使用者组名称
-c显示更改的部分的信息
-f忽略错误信息
-h修复符号链接
-v显示详细的处理信息
--help显示辅助说明
--version显示版本
Note:利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符。 。
chown 需要超级用户 root 的权限才能执行此命令。
只有超级用户和属于组的文件所有者才能变更文件关联组。非超级用户如需要设置关联组可能需要使用 chgrp 命令。
chmod:
chmod命令 用来变更文件或目录的权限在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。
用户可以使用 chmod 指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。
符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
权限范围的表示:表示描述uUser, 即文件或目录的拥有者
gGroup,即文件或目录的所属群组
oOther,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围
aAll,即全部的用户,所属群组以及其他用户
r读取权限,数字代号为 4
w写入权限,数字代号为 2
x执行或切换权限,数字代号为 1
-不具备任何权限,数字代号为 0
s特殊功能说明: 变更文件或目录的权限
选项:选项缩写描述--changes-c效果类似 -v 选项,但仅回报更改的部分.
--quiet 或者 --silent-f不显示错误信息.
--recursive-R递归处理,将指令目录下的所有文件及子目录一并处理.
--verbose-v显示指令的执行过程
--reference=把指定文件或目录的所有群组全部设成和参考文件或目录的所属群组相同
+开启权限范围的文件或目录的该选项权限设置
-关闭权限范围的文件或目录的该选项权限设置
=指定权限范围的文件或目录的该选项权限设置
扩展:Linux 用户分为 拥有者、组群(Group)、其他(Other)
系统中所有的账号与一般身份使用者, 以及 root 相关信息 都记录在 /etc/passwd 文件中.
每个人的密码则记录在 /etc/shadow 文件下.
所有的组群名称记录在 /etc/group 内.
权限图片分析:
Refs:
备份:
rsync 文件同步:*1.rsync 是一个常用的 Linux 应用程序,用于文件同步.
*2.它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步).
*3.它也可以当作文件复制工具,替代`cp`和`mv`命令.
*4.它名称里面的`r`指的是 remote,rsync 其实就是"远程同步"(remote sync)的意思.
*5.与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动).
*6.如果是本地和远程同步,传输双方都必须安装 rsync.
*7.默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。
基本命令格式:# -r: 表示递归,即包含子目录, -r 是必须的,否则 rsync 运行不成功.(可以使用 -a 代替 -r).
# source 为多个时候,多个 source 都会同步到 destination.
# 目标目录 destination 如果不存在,rsync 会自动创建.
$ rsync -r source1 [..source2] destination
路径注意事项 Ps:# source 后面带 / 和不带 / 是两回事
$ rsync -r source1 destination
# destination/source1 , destination 下面的子目录 source1 跟 源目录 source1 内容一致。
$ rsync -r source1/ destination
# destination 的内容跟 源目录 source1 的内容一致
目标目录成为源目录的镜像副本:# 第7点描述的意思,就是在没有特定参数的情况下,rsync 只是将 源目录的内容 复制到 目标目录,确保源目录有的内容,目标目录都会有。
# 为了确保 源目录 没有的内容,目标目录都不要存在使用下面参数
# --delete 这将删除只存在于目标目录、不存在于源目录的内容。
$ rsync -r --delete source/ destination
模拟同步结果,并且输出到终端:# -n: 参数模拟命令执行结果, 如果只是 -n 不带 v,我们在终端上,什么都看不到.
# -v: 将结果输出到终端.
参数列表:参数参数简写描述例子--archive-a1.除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等);
2.像 -rlptgoD (no -H) 参数.
3.由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以-a比-r更有用
--recursive-r递归目录
-D保持设备文件信息
-P显示同步过程,比如速率,比-v更加详细
--copy-links-L同步软链接时会把源文件给同步
--links-l保留软连接
--perms-p保持文件的权限属性
--times-t保持文件的时间属性
--owner-o保持文件的属主
--group-g保持文件的属组
--delete删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像
--human-readable-h表示以人类可读的格式输出.
--verbose-v1. -v参数表示输出细节。
2. -vv表示输出更详细的信息.
3. -vvv表示输出最详细的信息。
--dry-run-n模拟执行结果,不真正执行
--exclude按照模式,排除同步的文件/文件夹1. 单个排除模式: --exclude 'example/' 或者 --exclude='example/'
2. 多个排除模式: --exclude 'example/' --exclude 'example.txt'
3. 多个排除模式: --exclude={'example.txt','example/'}
--exclude-from从指定的文件中读取排除模式, 每个排除模式为一行--exclude-from='exclude-file.txt'
--include1.按照模式,不排除文匹配的文件/文件夹.
2.通常跟 --exclude 一起使用, 为了保留被 --exclude 模式匹配, 但不希望被排除掉的文件/文件夹.
3.使用这个参数的好处是不需要高度匹配 --exclude 的排除模式,并且在不清楚文件类型时候,确认同步的文件类型保留就行了.1. 单个模式: --include 'example/' 或者 --include='example/'
2. 多个模式: --include 'example/' --include 'example.txt'
3. 多个模式: --include={'example.txt','example/'}
--include-from从指定的文件中读取不排除模式, 每个不排除模式为一行--include-from='include-file.txt'
--max-size设置传输的最大文件的大小限制比如不超过200KB(--max-size='200k')
--min-size设置传输的最小文件的大小限制比如不小于10KB(--min-size=10k)
--itemize-changes-i表示输出源目录与目标目录之间文件差异的详细情况
--prune-empty-dirs-m指定不同步空目录
--update-u表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件.
--ignore-non-existing--existing表示不同步目标目录中不存在的文件和目录。
--progress表示显示进展
--size-only表示只同步大小有变化的文件,不考虑文件修改时间的差异
--suffix指定文件名备份时,对文件名添加的后缀,默认是~
--remove-source-files表示传输成功后,删除发送方的文件
--daemon运行一个 rsync 的守护进程
日期时间:
date:
描述:1.date命令可以用来显示或设定系统的日期与时间,在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记 。
2.若是不以加号作为开头,则表示要设定时间,而时间格式MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数。
3.这种方式只是临时修改系统时间,当系统重新启动的时候就会还原.
4.普通用户是不被授予修改时间的权限的, 只有超级用户才能用 date 修改系统时间。
语法格式:date [选项] [+输出形式]
输出形式字符串(必须有加号): +"%Y-%m-%d" 或 "+%Y-%m-%d"参数简写参数描述--date-d格式: --date=datestr; 显示 datestr 中所设定的时间 (非系统时间)
--set-s将系统时间设为 datestr 中所设定的时间
--universal 或者 --utc-u显示目前的格林威治时间
--help显示 date 命令帮助信息
--rfc-3339--rfc-3339=date, 显示日期; --rfc-3339=ns, 显示日期时间(毫微秒); --rfc-3339=ns, 显示日期时间(秒)
用于 创建日期目录和日期文件时候:$ mkdir `date +"%Y-%m-%d"`
# 2020-11-25/
$ touch `date +"%Y-%m-%d".txt`
# 2020-11-25.txt
目录:
cat:
cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容
格式:cat 文件1 [...文件n]参数功能-n或-number有1开始对所有输出的行数编号
-b或--number-nonblank和-n相似,只不过对于空白行不编号
-s或--squeeze-blank当遇到有连续两行以上的空白行,就代换为一行的空白行
-A显示不可打印字符,行尾显示“$”
tac:
cat命令的反向,只反向从下到上,不反向左右.
more:
用来查看一个文件的内容。当文件内容太多,一屏幕不能占下,而你用cat肯定是看不前面的内容的,那么使用more就可以解决这个问题了。当看完一屏后按空格键继续看下一屏。但看完所有内容后就会退出。如果你想提前退出,只需按q键即可
less:作用跟more一样,但比more好在可以上翻,下翻。空格键同样可以翻页,而按”j”键可以向下移动(按一下就向下移动一行),按”k”键向上移动。
在使用more和less查看某个文件时,你可以按一下”/” 键,然后输入一个word回车,这样就可以查找这个word了。如果是多个该word可以按”n”键显示下一个。
另外你也可以不按”/”而是按”?”后边同样跟word来搜索这个word,唯一不同的是,”/”是在当前行向下搜索,而”?”是在当前行向上搜索
head:
head后直接跟文件名,则显示文件的前十行。如果加 –n 选项则显示文件前n行
tail:
后面直接跟文件名,则显示文件最后十行。如果加-n 选项则显示文件最后n行。
cd:
切换目录
格式:
cd 目录路径返回上一次所在的目录: cd - 或者 cd $OLDPWD
切换到主目录: cd ~
touch:
创建文件
格式:
touch 文件名
mv:
移动或者重命名
cp:
复制
mkdir:
新建文件夹
创建多级目录:# -p 目录存在就忽略,不存在就创建
$ mkdir -p aaa/bbb/ccc
# 按日期时间创建多级目录
$ mkdir `date +"%Y-%m-%d"`/`date "+%H-%M"`
rmdir:
删除文件夹
rm:
删除文件夹或者文件
Ps:这个命令使用的时候,要特别小心(打醒12分精神来使用它); 否则,很容易就从删库到跑路.参数简写参数描述--dir-d
--force-f强制删除, 无需确认
--recursive-R 或者 -r递归删除子目录
-i在删除前需要确认
-I在删除超过三个文件或者递归删除前要求确认。此选项比-i 提
示内容更少,但同样可以阻止大多数错误发生
--no-preserve-root不特殊对待 "/"
--preserve-root不允许删除"/"(默认)
清空文件夹(不删除): rm -rf 文件夹路径/文件夹路径/.
file:
查看文件类型
ls:
列出路径下面的文件夹和文件参数简写功能--all-a所有文件夹和文件(包括隐藏的文件夹和文件,默认不显示隐藏的文件夹和文件)
-1竖立输出文件夹和文件名称
-l文件夹或者文件的长清单
显示隐藏文件/文件夹
1.隐藏文件/文件夹以点开始.
2.所以我们可以用ls .* 来显示。但是默认情况下,如果是目录,会显示目录包含的文件,此时可以用-d来避免 表示只显示第一层。
命令:
ls -d .*
du 查看文件/文件夹空间:
du命令的英文全称是“Disk Usage”,即用于查看磁盘占用空间的意思。但是与df命令不同的是du命令是对文件和目录磁盘使用的空间的查看,而不是某个分区.
语法格式:du [参数] [文件]
常用参数:参数简写参数描述-all-a显示目录中所有文件大小
-k以KB为单位显示文件大小
-m以MB为单位显示文件大小
-g以GB为单位显示文件大小
--human-readable-h以易读方式显示文件大小
--summarize-s仅显示总计
--max-depth-d最大目录深度
--timeshow time of last modification of any file in the directory
--total-cproduce a grand total
--versiondisplay version information
--help输出 du 命令的帮助文档
df 显示磁盘空间使用情况:
df命令的英文全称即“Disk Free”,顾名思义功能是用于显示系统上可使用的磁盘空间。默认显示单位为KB,建议使用“df -h”的参数组合,根据磁盘容量自动变换合适的单位,更利于阅读.
df 可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力.
日常普遍用该命令可以查看磁盘被占用了多少空间、还剩多少空间等信息.
语法格式: df [参数] [指定文件]
查找
find:
find指令怎么过滤掉没有查看权限的文件: find 路径 -name 文件名 2>/dev/null
open:
open 命令用于打开文件(files)或者目录
参数:参数描述-aa 就是 application, 指定用于打开文件/目录的应用程序
-b指定应用程序在打开文件时要使用的包标识符
-e用/Applications/TextEdit打开文件
-t使文件用默认的文本编辑器打开,通过LaunchServices确定
-f从标准输入读取输入,并在默认文本编辑器中打开结果。通过发送EOF字符结束输入(类型Control-D)。
对于管道输出打开和在默认文本编辑器中打开它也很有用
-F打开应用程序 “fresh”,也就是说,不恢复窗口。保存的持久状态会丢失,未命名的文档除外
-W导致open等待,直到它打开的(或已经打开的)应用程序退出。带-n标志使用时,允许打开到函数作为$EDITOR环境变量的适当应用程序
-R显示查找程序中的文件,而不是打开它们。
-n打开应用程序的一个新实例,即使一个实例已经在运行
-g不把应用程序带到前台
-j启动隐藏的应用程序
-h搜索标题位置,寻找名称与给定字符串匹配的标题,然后打开它。传递一个完整的头名称(比如NSView.h)以提高性能
-s-h,部分或全部SDK名称使用;如果提供了参数值,则只搜索名称中包含参数值的sdk。否则,使用每个平台中版本最高的SDK
--args所有剩下的参数都通过argv参数传递给main()打开的应用程序。open工具没有打开或解释这些参数。
--stdin启动应用程序,并将stdin连接到PATH
--stdout启动应用程序,并将stdout连接到PATH
--stderr启动应用程序,并将stderr连接到PATH
技巧:$ # 命令行打开目录 或者 命令行使用应用打开目录或者文件,都是使用这个命令
$ # 打开当前目录
$ open ./
$ # 使用 IDEA 打开目录
$ # 第一种:(这一个种就是第二种的缩写,对了双引号,但少了空格的反斜杠,并且少了找到具体的执行的位置,推荐使用这种)
$ open -a "IntelliJ IDEA" ./
$ # 第二种:
$ # (这种是通过 Applications 下面的安装了的应用程序的打开路径,进行执行的, 不推荐使用这种,因为要找到具体执行的命令文件,这里 Contents 后面的执行文件位置是我自己找出来的, 其他应用程序的位置不一定在MacOS下面,也不一定名字很好认。例如: Sublime Text 是在 SharedSupport\bin 下面叫 subl的执行文件)
$ open -a /Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea
使用技巧:
获取当前目录名称:# 第一种方法: 使用 basename 命令, 嵌套 pwd
$ echo $(basename `pwd`)
# 第二种方法: 使用字符串删除, 贪婪匹配
$ echo ${PWD##*/}
显示当前目录完整路径: pwd
查看安装目录路径: which 软件名等
查看当前系统中所有可登录shell的类型: cat /etc/shells
查看正在运行shell的类型: echo $SHELL 或者 echo $0
切换shell使用:chsh -s shell位置路径
# 这样切换后,echo $SHELL 输出的依旧是之前的 shell, 这里要用 su 重新登录一下用户
查看某个用户的Shell类型:以root为例,执行 cat /etc/passwd | grep ^root 最后一个:号字段显示的即为root用户的登录shell类型,为bash
查看shells 执行过的文件记录: history
查看文件内容时候过滤空行和 # 注释:# '^$' 空行
# "|#" 将带有 # 的行号去掉
# -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式
# -v 反转查找
$ cat 文件名 | grep -Ev "^$|#"
上面还是匹配不够好,下面是第二个版本的匹配# "\ " 是匹配空格,
# * 匹配前面0个或者多个
$ cat 文件名 | grep -Ev "^$|^#|^\ *#|^\ *//"
MacOS:
快捷键:
清屏: command(⌘) + k
删除整行: control(⌃) + c