您最喜欢的命令行功能或技巧是什么?

cmc*_*nty 93 command-line shell

分享您的 Unix/Linux 命令行功能和技巧。如果可能的话,尽量保持它的外壳/发行版不可知。有兴趣查看别名、单行、键盘快捷键、小 shell 脚本等。

Mic*_*zek 88

!!此答案中提到的技巧上有所扩展。实际上有一堆与历史相关的命令往往会被遗忘(人们倾向于刺Up100 次而不是寻找他们知道他们输入的命令)。

  • history命令将显示最近运行的命令列表,左侧有一个事件指示符
  • !N 将替换与事件指示符关联的命令 N
  • !-N将替代N 最近的命令; 例如!-1将替换最近的命令,!-2第二个最近的命令,等等。
  • 正如在另一个答案中提到的,!!是 , 的简写!-1,以快速替换最后一个命令
  • !string 将替换以开头的最新命令 string
  • !?string? 将替换包含的最新命令 string

可以将字指示符添加到!历史命令以修改结果。冒号分隔事件和单词指示符,例如!!:0。事件指示符在使用单词指示符时!!可以缩写为 just !,因此!!:0等效于!:0

  • !:0 将得到执行的命令
  • !:1将获得第一个参数(以及!:2第二个参数等)
  • !:2-3 将获得第二个和第三个参数
  • !:^是获得第一个参数的另一种方法。!:$将得到最后
  • !:*将获得所有参数(但不是命令)

修饰符也可以附加到!历史命令,每个修饰符都以冒号为前缀。任何数字都可以堆叠(例如!:t:r:p)。

  • h -- 与基本文件名对齐
  • t -- 只有基本文件名
  • r -- 与文件扩展名对齐
  • e -- 只有文件扩展名
  • s/search/replacement-替换第一次出现searchreplacement
  • gs/search/replacement-更换所有出现的searchreplacement

  • 如果您正在使用 Bash(对于某些其他 shell 可能相同),M-^ (Meta-^) 会为您扩展上述历史扩展运算符,以防万一您想查看您实际指的是什么到。 (3认同)

chi*_*tom 64

bash -- 插入前一行的最后一个参数

alt-. 有史以来最有用的组合键,试试看,不知为何没人知道这个组合。

一次又一次地按下它以选择较旧的最后参数。

当您想对刚才使用的参数/文件做更多事情时,这很棒。

  • 您还可以使用 !$ 来引用上一个命令中的最后一个参数。这很有用,因为它可以在脚本中以及以交互方式工作。(适用于 bash 和 zsh) (11认同)
  • 每次你点击 `alt`-`.` 时,它都会转到上一个命令并从中提取最后一个参数。因此,如果您想要三个命令前的最后一个参数,只需点击 `alt`-`.` 三下。 (4认同)
  • 这是 `yank-last-arg` readline 命令的默认键绑定,因此它应该适用于任何链接到 readline 的程序,而不仅仅是 BASH 或 ZSH。 (2认同)

小智 49

我最喜欢的是

man 7 ascii
Run Code Online (Sandbox Code Playgroud)

简单而且非常有用。

   Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
   ????????????????????????????????????????????????????????????????????????
   000   0     00    NUL '\0' (null character)   100   64    40    @
   001   1     01    SOH (start of heading)      101   65    41    A
   002   2     02    STX (start of text)         102   66    42    B
   003   3     03    ETX (end of text)           103   67    43    C
   004   4     04    EOT (end of transmission)   104   68    44    D
   005   5     05    ENQ (enquiry)               105   69    45    E
   006   6     06    ACK (acknowledge)           106   70    46    F
   007   7     07    BEL '\a' (bell)             107   71    47    G
   010   8     08    BS  '\b' (backspace)        110   72    48    H
   011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
   012   10    0A    LF  '\n' (new line)         112   74    4A    J
   013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
   014   12    0C    FF  '\f' (form feed)        114   76    4C    L
   015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
   016   14    0E    SO  (shift out)             116   78    4E    N
   017   15    0F    SI  (shift in)              117   79    4F    O
   020   16    10    DLE (data link escape)      120   80    50    P
   021   17    11    DC1 (device control 1)      121   81    51    Q
   022   18    12    DC2 (device control 2)      122   82    52    R
   023   19    13    DC3 (device control 3)      123   83    53    S
   024   20    14    DC4 (device control 4)      124   84    54    T
   025   21    15    NAK (negative ack.)         125   85    55    U
   026   22    16    SYN (synchronous idle)      126   86    56    V
   027   23    17    ETB (end of trans. blk)     127   87    57    W
   030   24    18    CAN (cancel)                130   88    58    X
   031   25    19    EM  (end of medium)         131   89    59    Y
   032   26    1A    SUB (substitute)            132   90    5A    Z
   033   27    1B    ESC (escape)                133   91    5B    [
   034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
   035   29    1D    GS  (group separator)       135   93    5D    ]
   036   30    1E    RS  (record separator)      136   94    5E    ^
   037   31    1F    US  (unit separator)        137   95    5F    _
   040   32    20    SPACE                       140   96    60    `
   041   33    21    !                           141   97    61    a
   042   34    22    "                           142   98    62    b
   043   35    23    #                           143   99    63    c
   044   36    24    $                           144   100   64    d
   045   37    25    %                           145   101   65    e
   046   38    26    &                           146   102   66    f
   047   39    27    '                           147   103   67    g
   050   40    28    (                           150   104   68    h
   051   41    29    )                           151   105   69    i
   052   42    2A    *                           152   106   6A    j
   053   43    2B    +                           153   107   6B    k
   054   44    2C    ,                           154   108   6C    l
   055   45    2D    -                           155   109   6D    m

   056   46    2E    .                           156   110   6E    n
   057   47    2F    /                           157   111   6F    o
   060   48    30    0                           160   112   70    p
   061   49    31    1                           161   113   71    q
   062   50    32    2                           162   114   72    r
   063   51    33    3                           163   115   73    s
   064   52    34    4                           164   116   74    t
   065   53    35    5                           165   117   75    u
   066   54    36    6                           166   118   76    v
   067   55    37    7                           167   119   77    w
   070   56    38    8                           170   120   78    x
   071   57    39    9                           171   121   79    y
   072   58    3A    :                           172   122   7A    z
   073   59    3B    ;                           173   123   7B    {
   074   60    3C    <                           174   124   7C    |
   075   61    3D    =                           175   125   7D    }
   076   62    3E    >                           176   126   7E    ~
   077   63    3F    ?                           177   127   7F    DEL
Run Code Online (Sandbox Code Playgroud)

看看这个网站commandlinefu.com

您还可以在 Peteris Krumins 的博客上查看这四篇文章

  • 单独的 `ascii` [程序](http://packages.ubuntu.com/karmic/ascii) 也很有用。除了打印表格外,它还可以让您查询一个或多个单独的字符。 (2认同)

Ale*_*x B 46

以 root 身份执行最后一条命令:

sudo !!
Run Code Online (Sandbox Code Playgroud)


Mic*_*zek 42

不确定这是否算作“技巧”,但人们似乎非常不知道标准的 readline 热键。在 shell 中的特殊用途:

  • Ctrl+ U- 剪切当前行
  • Ctrl+ Y- 用Ctrl+粘贴一条线剪切U
  • Ctrl+ L- 清屏并重绘当前行
  • Ctrl+ G- 换行并放弃当前行

  • 只是添加一些:Ctrl+A 转到行首,Ctrl+E 转到行尾,Ctrl-K 擦除光标到行尾。 (5认同)

小智 36

CTRL+R在 BASH 中搜索/激活以前执行的命令(~/.bash_history 的内容)。

这通常非常有帮助。运行此别名将在端口 8000 上通过 HTTP(索引)为 PWD 提供服务:

alias webserver="python -m SimpleHTTPServer"
Run Code Online (Sandbox Code Playgroud)

而且因为我一直在运行 make 并且打字太快,这些别名可能是我最常用的(认真的):

alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make
Run Code Online (Sandbox Code Playgroud)

可能我最常用的 BASH 是一个我称之为上传的简单脚本。我使用它将任何类型的内容 blit 到我的 Linode,并将生成的 HTTP URL 复制到我的剪贴板(单击中键)。对于在 IRC 中向人们粘贴内容非常有用:

scp -r $* $user@$host:public_html && {
    URL="http://$host/~$user/$(basename $1)"
    echo "$URL"
    xselection -replace PRIMARY "$URL"
}
Run Code Online (Sandbox Code Playgroud)

只是一对。我可以稍后发布更多,必须回去工作!

  • `alias mk=make` 输入速度更快,出错的可能性更小。或者使用热键从您的编辑器编译... (8认同)

Ale*_*x B 31

diff 两个命令的输出,无需手动创建临时文件(bash):

diff <(ls dir1) <(ls dir2)
Run Code Online (Sandbox Code Playgroud)


小智 30

非常基本,但人们似乎不知道,将您返回到上一个目录:

cd -
Run Code Online (Sandbox Code Playgroud)


小智 29

这通常在我的启动脚本中(.bashrc、.profile 等)

shopt 天哪,看看评论:

shopt -s cdspell        # try to correct typos in path
shopt -s dotglob        # include dotfiles in path expansion
shopt -s hostcomplete   # try to autocomplete hostnames
Run Code Online (Sandbox Code Playgroud)

保存击键的别名: mkdircd放入其中:

mkcd () { mkdir -p "$@" && cd "$@"; }
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点,我已经放弃记住 tar 语法,所以:

extract () {
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2)  tar xjf $1      ;;
            *.tar.gz)   tar xzf $1      ;;
            *.bz2)      bunzip2 $1      ;;
            *.rar)      rar x $1        ;;
            *.gz)       gunzip $1       ;;
            *.tar)      tar xf $1       ;;
            *.tbz2)     tar xjf $1      ;;
            *.tgz)      tar xzf $1      ;;
            *.zip)      unzip $1        ;;
            *.Z)        uncompress $1   ;;
            *)          echo "'$1' cannot be extracted via extract()" ;;
        esac
    else
        echo "'$1' is not a valid file"
    fi
}
Run Code Online (Sandbox Code Playgroud)

  • +1,我怎么没想到呢?(提炼) (5认同)

Ste*_*fan 29

支撑扩展

大括号扩展是一种可以生成任意字符串的机制。

它允许您替换繁琐的行,例如:

mv loong/and/complex/file/name loong/and/complex/file/name.bacukup
Run Code Online (Sandbox Code Playgroud)

使用较短的实例

mv loong/and/complex/file/name{,backup}
Run Code Online (Sandbox Code Playgroud)

其他一些用途

# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave
diff /etc/rc.conf{,.pacsave}

# to list files in both /usr/share and /usr/local/share
ls /usr/{,local}/share 
Run Code Online (Sandbox Code Playgroud)

算术扩展

算术扩展允许对算术表达式求值并替换结果。算术展开的格式为:

$((expression))
Run Code Online (Sandbox Code Playgroud)

该表达式被视为在双引号内,但括号内的双引号不会被特殊处理。表达式中的所有标记都经过参数扩展、字符串扩展、命令替换和引号删除。算术扩展可以嵌套。

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
Run Code Online (Sandbox Code Playgroud)

  • 太好了,我不敢相信我忘记了这一点。还有一个更紧凑的 `foo[123]` 将扩展为 `foo1 foo2 foo3`,但它们需要是文件名才能在这种情况下工作 (3认同)

小智 21

两个 bash 函数,它为我节省了很多击键。

每次成功 cd 后自动执行 ls:

function cd {
    builtin cd "$@" && ls
}
Run Code Online (Sandbox Code Playgroud)

上n级:

# Usage .. [n]
function .. (){
    local arg=${1:-1};
    local dir=""
    while [ $arg -gt 0 ]; do
        dir="../$dir"
        arg=$(($arg - 1));
    done
    cd $dir #>&/dev/null
}
Run Code Online (Sandbox Code Playgroud)

  • 我从来没有意识到你可以使用 `builtin foo` 来绕过定义了 `cd` 的函数;我一直在我的函数中使用 `chdir`。便利 (4认同)
  • 我对 cd 的做法和你一样,但我有更多的健全性检查,并避免在非交互模式下执行 ls:`cd() { builtin cd -- "$@" &amp;&amp; { [ "$PS1" = " " ] || ls -hrt --color; }; }` (2认同)

men*_*ant 17

由于我通常在想要搜索之前进入命令行的一半(bash 中的 CTRL-R),因此我的 .bashrc 中有以下内容

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward
Run Code Online (Sandbox Code Playgroud)

这意味着,如果我输入 cd 然后按上/下,我可以看到我有 cd 的所有选项。基本上我将它用于经常使用的目录。就像“cd w”一样,我最终要浏览我经常使用的所有工作区。


jac*_*onh 17

为我节省大量时间的一件事是 pushd/popd 命令。这些家伙让你创建一堆目录并减少大量输入:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
Run Code Online (Sandbox Code Playgroud)

  • 是的!别名 u=pushd; 别名 o=popd (2认同)
  • .. 那么`u` 和`o` 在这里代表什么? (2认同)
  • 看起来像命令的第二个字母,因为它们都以 p 开头,所以不能同时使用它。 (2认同)

use*_*394 14

screen 命令。它基本上保存了您回来时的命令行会话。它有点像一个终端管理器,就像一个窗口管理器。这样,在单个终端会话中,您可以同时运行多个虚拟终端。这很酷。

如果使用screen,这个 shell 函数(放入.bashrc)非常有用:

function scr {
    if screen -ls | grep -q Main; then
         # reattach to Main: 
         screen -xr Main
    else
         # name session "Main":
         screen -S Main
    fi
   }
Run Code Online (Sandbox Code Playgroud)

输入后scr,它会检查您的主会话是否存在并将附加到它。否则它会创建它。


小智 13

如果你需要在 bash 中编辑一个特别长的命令行

^X^E (Ctrl-X Ctrl-E) 
Run Code Online (Sandbox Code Playgroud)

将在编辑器 ($EDITOR) 中打开它。

在 zsh 中,您可以通过将其添加到 .zshrc 来获得相同的行为:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 
Run Code Online (Sandbox Code Playgroud)


mig*_*aza 12

如果你是一个快速打字员,这些会派上用场:

alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'
Run Code Online (Sandbox Code Playgroud)

此宏可帮助您计算一列输出的总数:文件大小、字节、数据包,您所要做的就是指定要添加的列:

total ()
{
        if [ x$1 = x ]; then set `echo 1`; fi
        awk "{total += \$$1} END {print total}"
}
Run Code Online (Sandbox Code Playgroud)

例如,您可以像这样使用它,不带参数,它将第一列的总数相加:

du | total
Run Code Online (Sandbox Code Playgroud)

如果您提供参数,它将对该列求和,例如,这将为您提供 /tmp 中所有 C# 文件使用的总字节数:

ls -l /tmp/*cs | total 5
Run Code Online (Sandbox Code Playgroud)

有时你的控制台会因为你不小心查看了一个二进制文件(例如 cat /bin/ls)而搞砸了,你可以用这个 shell 函数来恢复终端:

restaura ()
{
    perl -e 'print "\e)B";'
}
Run Code Online (Sandbox Code Playgroud)

我喜欢我的 ls 使用字符来区分文件的类别,并且还隐藏了我的编辑器生成的备份文件(备份文件以 ~ 字符结尾):

alias ls='ls -FB'
Run Code Online (Sandbox Code Playgroud)

  • `s/快速/马虎/` (2认同)

Eim*_*tas 11

alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.
Run Code Online (Sandbox Code Playgroud)

当我忘记时,我的最爱之一s

$ s !! # last command with super user priviledges
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 ZSH,您可以执行诸如 `bindkey -s '\e[12~' "sudo !!\n"` 之类的操作来绑定(在本例中)F2 以运行该命令。我有那个绑定,所以当我运行一些东西并看到“你忘记了‘sudo’,傻瓜”的错误信息时,我只能恼火地按 F2 (2认同)

Mic*_*zek 10

如果命令接受 stdin 输入,则可以从带有<filename. 这可以出现在命令的任何地方,所以这些行是等效的:

cat filename
cat <filename
<filename cat
Run Code Online (Sandbox Code Playgroud)

这对 grep 尤其有用,因为它允许您将表达式放在行尾,因此您可以通过点击 快速修改 grep 命令Up,而无需向左滚动以跳过文件名:

<filename grep 'expression'
Run Code Online (Sandbox Code Playgroud)

  • 一个很好的提示!值得注意的是,这实际上并没有对命令的参数重新排序。相反,它将文件通过管道传输到进程的 STDIN,因为 grep 现在没有文件参数,它默认从 STDIN 读取。理解这一点将为将此技术与其他命令一起使用提供许多机会,并帮助人们了解当事情没有按预期工作时发生了什么。有关更多信息,请查找管道和重定向器:http://www.dsj.net/compedge/shellbasics1.html (3认同)

Mic*_*zek 9

您可以使用CDPATH来设置相当于PATH;的目录。如果您尝试cd foo并且foo当前目录中没有,shell 将检查每个目录CDPATHfoo在其中查找,并切换到它找到的第一个目录:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
Run Code Online (Sandbox Code Playgroud)

  • 这可能会导致问题。参见 http://www.softpanorama.org/Scripting/Shellorama/cdpath.shtml “如果设置了 $CDPATH,内置的 cd 不会隐式地将当前目录附加到它。这意味着如果没有有效目录,cd 将失败name 可以从 $CDPATH 中的任何条目构造,即使当前目录中存在与作为 cd 参数给出的名称同名的目录。” 我被这个咬了,一些 Makefile 停止工作了。附加 . 虽然明确可能会有所帮助,但也存在一些问题。 (3认同)

Mat*_*ons 9

vi `which scriptname`
Run Code Online (Sandbox Code Playgroud)

因为当你不知道某物住在哪里时,你也不在乎。

  • 我并不是要继续插入 ZSH 功能,但我一直在考虑其他人的回答:)。在 ZSH 中你可以做 =foo 来自动调用 `which`,所以 `vi =scriptname` (8认同)

use*_*394 9

符号。它会将您的命令置于后台,因此您可以继续输入。

$> sudo updatedb &
Run Code Online (Sandbox Code Playgroud)

一起工作,过了一会儿你会看到:

[1] 17403
Run Code Online (Sandbox Code Playgroud)

你的过程就完成了!非常适合您不需要等待它们终止的事情。

  • 如果您的应用程序是 GUI,您可能不希望它继续工作。将 `&amp;!` 附加到后台作业 _and_ 从外壳中删除它! (11认同)

use*_*394 8

选项卡完成。如果您必须输入每条路径的所有字符,这有多糟糕?

  • 有自杀Linux。如果您错误地键入命令 - 它会执行 `rm -fr /`。所以是的,标签完成非常重要...... (5认同)

小智 7

卸载上次安装的设备:

mount /media/whatever
...
u!mo
Run Code Online (Sandbox Code Playgroud)

!mo扩展到以mo(至少在 bash 中)开头的最后一个命令。有时一个mv在中间,所以u!m不会经常工作。


jcu*_*bic 7

我的 .bashrc 中有这个

#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'
Run Code Online (Sandbox Code Playgroud)

 

function find-all() {
    python -c "import re
import sys
for i in re.findall('$1', sys.stdin.read()):
    if type(i) == type(''):
        print i
    else:
        print i[0]"
}
Run Code Online (Sandbox Code Playgroud)

当我在剪贴板中有 html 源代码并想找到我使用的所有链接时

c-v | find-all 'href="([^"]*)"' | c-c
Run Code Online (Sandbox Code Playgroud)

我在剪贴板中有所有网址

我也有这个功能

function lsq(){
    ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}
Run Code Online (Sandbox Code Playgroud)

显示大小(人类可读)和文件名。

alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'
Run Code Online (Sandbox Code Playgroud)

此别名用于显示温度

function separate() {
    python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}
Run Code Online (Sandbox Code Playgroud)

使用此函数,我可以计算参数的乘积或总和。

alias sum='separate + | bc'
alias product='separate * | bc'

function split-join() {
    python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))";
}
Run Code Online (Sandbox Code Playgroud)

这是一个有用的函数,它拆分由正则表达式分隔的标准输入,然后连接结果。

function factorial() {
    seq -s* $1 | bc
}
Run Code Online (Sandbox Code Playgroud)

阶乘函数

function wiki() { dig +short txt $1.wp.dg.cx; }
Run Code Online (Sandbox Code Playgroud)

此功能通过 DNS 显示 wiki 文本

我也有三色功能

function blue() {
    echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}

function green() {
    echo -e "\x1b[32m\x1b[1m"$@"\x1b[0m";
}

function red() {
    echo -e "\x1b[31m\x1b[1m"$@"\x1b[0m";
}
Run Code Online (Sandbox Code Playgroud)

 

function md5check() {
    test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}
Run Code Online (Sandbox Code Playgroud)

此函数验证文件 md5 哈希。

这将显示给定代码的错误消息

function strerror() { python -c "import os; print os.strerror($1)"; }
Run Code Online (Sandbox Code Playgroud)

您可以打印所有消息

alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
Run Code Online (Sandbox Code Playgroud)


Mat*_*hen 6

另一个有用的 ZSH 技巧:

将命令的输出视为文件:

emacs =(hg cat -r 100 somefile)
Run Code Online (Sandbox Code Playgroud)

这会在 emacs 中打开一个旧版本的 Mercurial 跟踪文件,以进行语法突出显示。不这样做,我会更动hg reverthg archive或明确地发送hg cat输出到一个临时文件。

当然,这适用于任何打开文件的程序,以及任何打印到标准输出的程序。

  • 您可以在 bash 中使用 &lt;() (5认同)

Mic*_*zek 5

ZSH 特有的特性是后缀别名,通过提供alias以下-s标志来设置:

alias -s ext=program
Run Code Online (Sandbox Code Playgroud)

如果给定的扩展名有后缀别名,你可以直接执行带有该扩展名的文件,ZSH 将启动给定的程序并将文件名作为参数传递。因此,如果上述别名有效,则这些行是等效的:

/path/to/foo.ext
program /path/to/foo.ext
Run Code Online (Sandbox Code Playgroud)


Mic*_*zek 5

我最喜欢的 ZSH 功能之一是命名目录。您可以导出具有给定名称的变量,其值指向某个路径:

export foo=/usr/bin
Run Code Online (Sandbox Code Playgroud)

现在您可以~foo在命令中使用来引用/usr/bin

cd ~foo
~foo/ls
cat ~foo/filename
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

49603 次

最近记录:

8 年,8 月 前