Linux操作技巧

本文转载自labuladong的算法小抄,个人学习积累使用。

1. 标准输入和命令行参数区别

  • 管道符|,文件重定向>,变量$
  • 删除脚本:
  $ where connect.sh | rm
  # 这种方法是错误的
  $ rm $(where connect.sh)
  # 这种方法是对的

前一种方法试图将where的结果连接到rm的标准输入。

标准输入就是scanf、readline这种命令。

后一种方法将结果作为命令行参数传给rm。

命令行参数类似args字符数组。

  • rm只接受命令行参数,而cat接受两种方式。

2. 后台运行程序

  • (cmd &)使程序不发生阻塞,且退出服务器后依然可以访问web服务:
  $ python manager.py runserver 0.0.0.0
  # 这种写法会阻塞,无法继续输入内容
  $ (python manager.py runserver 0.0.0.0&)
  # 这种写法就不会造成阻塞,而且退出服务器后依然可以访问web服务
  $ kill $(ps -aux | grep "runserver")
  # 这种方法删除后台指定命令
  • 原理是:(cmd &)将cmd命令挂到一个systemd系统守护进程名下。

3. 单引号与双引号的区别

  • 对于$()这几个符号,单引号包围的字符串不会转义,而双引号包围的字符串会转义。
  • 如果$读取的字符串包含空格一类,应该使用双引号括起来,否则会报错。

4. sudo找不到命令

  • 使用sudo时,系统会使用/etc/sudoers这个文件规定的该用户的权限和环境变量。
  • 当命令不在/etc/sudoers环境变量目录中时,可以使用脚本文件的路径,而不仅仅是脚本名称。
  $ sudo /home/bluestragglers/connect.sh

5. 输入相似文件名技巧

  • 用花括号括起来的字符串用逗号连接,可以自动扩展。注意花括号内部不应有空格。
  $ echo {one,two,three}file
  onefile twofile threefile
  $ echo {one,two,three}{1,2,3}
  one1 one2 one3 two1 two2 two3 three1 three2 three3

  $ cp /bluestragglers/file{,.bak}
  # 给file复制一个叫file.bak的副本
  $ rm file{1,3,5}.txt
  # 删除file1.txt、file3.txt、file5.txt
  $ mv *.{c,cpp} bluestragglers/
  # 将所有c、cpp后缀的文件都移动到bluestragglers中

6. 输入路径名技巧

  • 返回刚才的目录:cd -
  • 上次命令的路径:!$
  • 上次命令所有文件的路径:!*
  • 加入常用工作目录:export CDPATH='bluestragglers'

7. 输入重复命令技巧

  • 输入上次命令:!!
  • 反向搜索历史命令:Ctrl + R
  • 搜索某个历史命令:history | grep 'bluestragglers'!123
  • 简化搜索:export .bashrc='his(){history | grep "$@"}'his bluestragglers

8. 其他技巧

  • 自动输入yes:yes | cmd
  • 记录上次命令返回值:$?
  • 记录当前进程PID:$$

参考目录

  1. 关于Linux shell你必须知道的
  2. Linux shell的实用小技巧