Skip to content

命令行

Linux、Windows、Android 等操作系统的命令行备忘。

概念

  • 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 可以切换到对应的控制台,tty1tty2 都是 X 窗口系统,其余是虚拟字符终端。
    • 系统控制台:/dev/console,用于接收系统消息。系统消息不会发送到 tty,而是发送给 console

Linux

作业控制

作业(job)是一个或(由管道连接的)多个命令组成的序列。

  • 终止执行:

    • 发送中断信号(terminal interrupt signal):Ctrl+CDel
      • 有的程序会立即停止执行,有的程序会忽略这个信号。
    • 挂起程序:Ctrl+Z
      • bg 跟作业编号可以将挂起作业放到后台运行。
      • 挂起后程序暂停。随后使用 kill -TERM 向该程序发送终止信号(termination signal)。
      • 如果终止信号不能起作用,那就发送杀死信号 -KILL。运行中的程序不能忽略杀死信号。
  • 前后台切换

在命令行末尾附加 & 符号可以让 Shell 在后台运行该作业。Shell 会给作业分配一个作业编号,用方括号括起来;操作系统会给作业分配一个进程标识(process identification,PID)号。作业完成后,Shell 显示已结束的作业编号和运行作业的命令行。

$ ls -l | lpr &
[1] 22092
$
[1]+ Done      ls -l | lpr

fg 可以将后台作业移到前台运行。

通配符(wildcard)

对模糊文件引用进行展开的过程称为通配(globbing)。这一操作由 Shell 进行,实用程序一般不能解析模糊文件引用。

符号 作用
* 匹配零个或多个字符
? 匹配单个字符
[] 匹配中括号内的任意一个字符
匹配任意一个数字
{} 创建文件时使用,

注意:*? 不与以 . 开头的文件名匹配。若要匹配,使用 .*

方括号相关:

符号 作用
[A-Z]
[a-Z]
[0-9]
[[:alpha:]]
[[:alnum:]] 字母和数字
[[:punct:]] 标点符号
[^ab] 匹配除 ab 外的字符

注意,[0-35] 会匹配 0-35

Shell 首先用字符列表中的成员逐个替换方括号和其中的字符列表,然后将匹配的文件名列表传递给调用它的程序。

屏幕和键盘设备文件

程序不会知道标准输入究竟来自哪里,也不会知道标准输出究竟去往何处。Shell 执行命令时,为命令的标准输入和标准输出各分配一个文件。

使用 tty 命令可以看到你所在屏幕(窗口)的文件名,who -a 可以显示所有登录用户的屏幕文件名。

使用 Ctrl+D 会发送 EOF 信号,表示标准输入结束。

重定向

改变 Shell 标准输入输出的各种方式都是重定向。

  • 输入重定向
符号 作用
< 将文件作为命令的标准输入
<< 分界符 从标准输入读入,直到遇到分界符
  • 输出重定向
符号 作用
> 标准输出(清空)
2> 错误输出(清空)
>> 标准输出(追加)
2>>
>> 文件 2>&1 标准和错误输出(追加)
&>> 同上

重定向可能覆盖文件。考考你,cat orange pear > orange 会得到什么?

只会得到 pear 中的内容。

可以为 Shell 设置 noclobber 特性阻止重定向覆盖存在的文件。但该特性不能阻止管道,因此你可以使用 >| 规避该特性。

set -o noclobber
set +o 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
MAIL 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 的别名,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

简单命令

read
export
.

sed: Stream EDitor

  • 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-ContentOut-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,任何脚本都无法执行。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

更多

常用的比较运算符,和 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