命令行¶
Linux、Windows、Android 等操作系统的命令行备忘。
概念¶
Info
- Shell 是命令解释器和编程语言
- 作为命令解释器(command interpreter),Shell 对用户输入的命令进行解释,调用相应的程序。Shell 建立了用户和操作系统之间的接口。
- 作为编程语言,Shell 命令可以安排在一个文件中供以后执行,称为 Shell 脚本。
- Shell 特性:
- 通配符:这是一些对 Shell 具有特殊意义的字符,用于构造模式。
- 设备无关 I/O:输入输出可以被重定向,并且可以重定向到任何合适的设备。
- 函数:可以编写函数,Shell 将它们放在内存中。Shell 还用内部方式存储函数,这样不必耗费大量时间解释命令。
- 作业控制:允许用户同时运行多个作业,进行前后台切换。
- 控制台 console:
- 虚拟控制台:旧的系统包含多个物理控制台设备,现在一个主机模拟了多个控制台,称为虚拟控制台。Linux 系统默认情况下有 6 个虚拟控制台处于活动状态,它们是
/dev/tty1-6
,而/dev/tty0
是当前虚拟控制台的别名。在 X 窗口系统下,使用 Ctrl+Alt+F1 可以切换到对应的控制台,tty1
和tty2
都是 X 窗口系统,其余是虚拟字符终端。 -
系统控制台:
/dev/console
,用于接收系统消息。系统消息不会发送到tty
,而是发送给console
。¶
- 虚拟控制台:旧的系统包含多个物理控制台设备,现在一个主机模拟了多个控制台,称为虚拟控制台。Linux 系统默认情况下有 6 个虚拟控制台处于活动状态,它们是
Linux¶
作业控制¶
作业(job)是一个或(由管道连接的)多个命令组成的序列。
-
终止执行:
- 发送中断信号(terminal interrupt signal):Ctrl+C,Del
- 有的程序会立即停止执行,有的程序会忽略这个信号。
- 挂起程序:Ctrl+Z
bg
跟作业编号可以将挂起作业放到后台运行。- 挂起后程序暂停。随后使用
kill -TERM
向该程序发送终止信号(termination signal)。 - 如果终止信号不能起作用,那就发送杀死信号
-KILL
。运行中的程序不能忽略杀死信号。
- 发送中断信号(terminal interrupt signal):Ctrl+C,Del
-
前后台切换
在命令行末尾附加 &
符号可以让 Shell 在后台运行该作业。Shell 会给作业分配一个作业编号,用方括号括起来;操作系统会给作业分配一个进程标识(process identification,PID)号。作业完成后,Shell 显示已结束的作业编号和运行作业的命令行。
fg
可以将后台作业移到前台运行。
通配符(wildcard)¶
对模糊文件引用进行展开的过程称为通配(globbing)。这一操作由 Shell 进行,实用程序一般不能解析模糊文件引用。
符号 | 作用 |
---|---|
* |
匹配零个或多个字符 |
? |
匹配单个字符 |
[] |
匹配中括号内的任意一个字符 |
匹配任意一个数字 | |
{} |
创建文件时使用, |
注意:*
和 ?
不与以 .
开头的文件名匹配。若要匹配,使用 .*
。
方括号相关:
符号 | 作用 |
---|---|
[A-Z] |
|
[a-Z] |
|
[0-9] |
|
[[:alpha:]] |
|
[[:alnum:]] |
字母和数字 |
[[:punct:]] |
标点符号 |
[^ab] |
匹配除 a ,b 外的字符 |
注意,[0-35]
会匹配 0-3
或 5
。
Shell 首先用字符列表中的成员逐个替换方括号和其中的字符列表,然后将匹配的文件名列表传递给调用它的程序。
屏幕和键盘设备文件¶
程序不会知道标准输入究竟来自哪里,也不会知道标准输出究竟去往何处。Shell 执行命令时,为命令的标准输入和标准输出各分配一个文件。
使用 tty
命令可以看到你所在屏幕(窗口)的文件名,who -a
可以显示所有登录用户的屏幕文件名。
使用 Ctrl+D 会发送 EOF 信号,表示标准输入结束。
重定向¶
改变 Shell 标准输入输出的各种方式都是重定向。
- 输入重定向
符号 | 作用 |
---|---|
< | 将文件作为命令的标准输入 |
<< 分界符 | 从标准输入读入,直到遇到分界符 |
- 输出重定向
符号 | 作用 |
---|---|
> | 标准输出(清空) |
2> | 错误输出(清空) |
>> | 标准输出(追加) |
2>> | |
>> 文件 2>&1 | 标准和错误输出(追加) |
&>> | 同上 |
重定向可能覆盖文件。考考你,cat orange pear > orange
会得到什么?
只会得到 pear
中的内容。
可以为 Shell 设置 noclobber
特性阻止重定向覆盖存在的文件。但该特性不能阻止管道,因此你可以使用 >|
规避该特性。
/dev/null
这是一个 data sink,称为 bit bucket,可以将不想保存的数据重定向到这里,它会不留痕迹地消失。从该文件读取会得到一个空字符串。
管道¶
管道命令符 |
的作用是将前一个命令的输出作为后一个命令的输入。管道不会单独处理每条命令,并且不需要中间文件。
tee
工具将标准输入复制到文件和标准输出。有时你可以把它插在管道中监测管道中的数据流动。
转义字符¶
符号 | 作用 |
---|---|
\ |
使后面的一个字符变为单纯的字符 |
'' |
纯字符串 |
"" |
替换变量 |
` |
执行其中的命令,用返回值替换 |
别名¶
使用 alias 别名=命令
创建别名,用 unalias
取消别名。
内部命令¶
使用 type [commandName]
来判断一个命令是否是内部命令。
环境变量¶
一名态度谨慎、有经验的运维人员,接手一台 Linux 系统后在执行命令前会先检查 PATH
变量是否有可疑目录。
环境变量会因为用户身份和 shell 的不同而具有不同的值。使用 env
命令查看系统中所有环境变量。
下表列出了重要的环境变量:
Name | Function |
---|---|
HOME | home directory of the user |
SHELL | name of current using shell |
where mails are saved | |
LANG | system language name |
RANDOM | generate a random number |
PS1 | Bash 提示符 |
PATH | |
EDITOR | user default text editor |
Shell 编程¶
下面是一些常用的环境变量:
Name | Content |
---|---|
$0 |
Name of the script |
${num} |
Arguments |
$* |
All arguments |
$? |
Return value of the last command |
$# |
Number of arguments |
$$ |
PID of the current script |
!! |
Entire last command |
$(CMD) |
Command substitution as variable |
<(CMD) |
Process substitution as file |
控制¶
#!/bin/sh
for i in hello 1 * 2 goodbye
do
echo "Looping ... i is set to $i"
done
for file in "$@"; do
if [[]]; then
fi
done
INPUT_STRING=hello
while [ "$INPUT_STRING" != "bye" ]
do
echo "Please type something in (bye to quit)"
read INPUT_STRING
echo "You typed: $INPUT_STRING"
done
while :
do
echo "Please type something in (^C to quit)"
read INPUT_STRING
echo "You typed: $INPUT_STRING"
done
while read input_text
do
case $input_text in
hello) echo English ;;
howdy) echo American ;;
gday) echo Australian ;;
bonjour) echo French ;;
"guten tag") echo German ;;
*) echo Unknown Language: $input_text
;;
esac
done < myfile.txt
if [ something ]; then
echo "Something"
elif [ something_else ]; then
echo "Something else"
else
echo "None of the above"
fi
测试¶
[
是test
的别名,test
是一个命令,用于测试条件表达式。
因此,[
应当被空格包围。
表达式执行后,结果储存在 $?
中。
Name | Function |
---|---|
-eq |
integer equal |
= |
string equal |
-z |
- 逻辑运算符
Name | Function |
---|---|
&& |
逻辑与 |
- 文件测试
Name | Function |
---|---|
-d | Is a directory |
-e | Exist |
-f | Is file |
-r | Has the right to read |
-w | Has the right to write |
-x | Has the right to execute |
简单命令¶
sed
: Stream EDitor¶
Info
- Read->Execute->Display
- Pattern Buffer
- 命令和 vim 类似
- 不指定范围则对每一行执行
# 常用选项
-e -n -f
# 范围
[address1[,address2]]
$
3,$
2,+4
50~5
/Alchemist/, 5
# 替换
[address1[,address2]]s/pattern/replacement/[flags]
# 各种命令
p: print
[address1[,address2]]d
[address1[,address2]]w file
[address]a Append text
[address1[,address2]]c Replace text
[address]i Insert text
y: translate
[address1[,address2]]y/list-1/list-2/
l: display hidden characters
[address1[,address2]]l [len]
q: quit
[address]q [exit state value]
r: read
[address]r file
e: execute
[address1[,address2]]e [command]
=: write line number followed by contents
&: stores the matched pattern
s/[[:digit:]]/Book number &/
# 替换详解
flag: p(rint) w(rite) i(gnore case)
delimiter: / | @ ^ !
group operator: create substring \( and \)
# 正则表达式
\w: match any letter, digit, or underscore
\+: match more than one characters
\N: reference substring
# 示例
echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'
Windows¶
cmd.exe
¶
作为 Windows 系统的远古命令解释器,只具有很少的命令,使用 help
就可以查看。
PowerShell¶
-
格式:PowerShell 与其他 Shell 的一个显著区别是它的命令名称,一般为
Verb-Noun
格式,比如Get-Command
。 -
对象:在 PowerShell 中,命令的结果作为对象传递,比如
Get-Process
返回System.Diagnostics.Process
对象。类型的成员的种类(MemberType)可以是属性(Property),也可以是方法(Method)。比如Get-Service
返回的System.ServiceProcess.ServiceController
具有close()
方法,可以直接调用。 -
管道:PowerShell 管道可以对对象进行很多操作,不过在 Linux 中我们最熟悉的是文本处理。可以使用
Get-Content
和Out-File
来进行:
# 关机
Stop-Computer -Force -ComputerName localhost
# 帮助
Update-Help
Get-Verb
Get-Command -Name -Verb -Noun [pattern]
Get-Help
help -Full
# 需要找什么命令直接查询即可,比如服务相关就查 `Get-Command -Name Service`"
# 对象
Get-Member -MemberType
Select-Object -First n -Property Name, Source
Where-Object [condition]
(Get-Service -Name w32time).Stop()
# 创建一个 `PSCustomObject` 类型的变量,具有 `Name` 成员,属性为 `w32time`(这是一个字符串 `System.String`)。
$CustomObject = [pscustomobject]@{
Name = 'w32time'
}
# 管道
'Background', 'Windows' | Out-File -FilePath $env:TEMP\services.txt
Get-Content -Path .\LineNumbers.txt
Get-Item -Path .\LineNumbers.txt | Get-Content -Tail 1
脚本执行权限¶
ExecutionPolicy
影响脚本能否执行,在客户端系统上一般都设置为 Restricted
,任何脚本都无法执行。
更多¶
常用的比较运算符,和 bash 差不多:
'PowerShell' -eq 'powershell'
-eq
-ceq #case sensitive
-gt
# 一个控制片段示例:
$number = Get-Random -Minimum 1 -Maximum 10
do {
$guess = Read-Host -Prompt "What's your guess?"
if ($guess -lt $number) {
Write-Output 'Too low!'
} elseif ($guess -gt $number) {
Write-Output 'Too high!'
}
}
while ($guess -ne $number)
Utilities¶
除了各 Shell 的内置命令,Windows 上还有一些实用工具:
- 开关机:
shutdown
- 立即关机:
shutdown /p /f
- 重启并自动登录并锁定:
shutdown /sg
- 立即关机:
- 系统管理:
chkdsk
:检查磁盘diskpart
:磁盘分区dism
:Windows 映像管理工具sfc
:系统文件检查
- 进程管理:
tasklist
:列出进程taskkill
:结束进程
- 网络:
ipconfig
:网络配置netstat
:网络状态net
:网络配置route
:路由表
adb¶
adb devices
adb install/uninstall
adb reboot [bootloader|recovery|sideload|sideload-auto-reboot]
adb shell
进入 Shell 后有一些常用的工具,具体用法查看工具自带的帮助。
dumpsys
查询系统、服务状态。如battery
等。wm
窗口管理器,控制显示方面。size [reset|WxH|WdpxHdp]
user-rotation [free|lock] [orientation]
settings
管理各项系统设置。list [system|secure|global]
put NAMESPACE KEY VALUE
pm
包管理器list packages