共享Unix / Linux的命令行功能和技巧。如果可能,请尝试使其与外壳/发行版无关。有兴趣查看别名,单行代码,键盘快捷键,小型Shell脚本等。

#1 楼

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


history命令将在左侧显示带有事件指示符的最近运行命令列表

!N将替换与事件指示符关联的命令N


!-N将替换N最新命令;例如!-1将替换最近的命令,!-2替换第二个命令,以此类推。
如另一个答案中所述,!!!-1的简写,可以快速替换最后一个命令以!string开头的最新命令


string将替换包含!?string?的最新命令



单词标识符可以是在string历史记录命令上添加了修改结果。冒号将事件和单词代号分隔开,例如!。使用单词指示符时,事件指示符!!:0可以缩写为!!,因此!等同于!!:0。 >
!:0将获得第一个参数(!:0将得到第二个,依此类推)。第一个论点。 !:1将获取最后一个

!:2将获取所有参数(但不是命令)


修饰符也可以附加到!:2-3历史记录命令中,每个前缀以冒号。可以堆叠任何数字(例如!:^)。



!:$-排列到基本文件名文件名

!:*-排列到文件扩展名

!-仅文件扩展名>
!:t:r:p-用h替换所有出现的t



评论


而且,如果您使用的是Bash(某些其他Shell可能相同),则M- ^(Meta- ^)会为您扩展上述历史扩展运算符,以防万一您想看看您实际引用的内容至。

–埃里克·史密斯(Eric Smith)
2010-09-16 14:41

我从来没有发现过!命令的东西。对我来说,运行一个我没有看到的命令似乎很糟糕。键入!-3而不是!-4很容易,谁知道会发生什么。找到我要运行的命令的行号通常比其价值更大。虽然很酷的技巧,但我从来没有发现它们真正的用处。

–法尔玛里
2010-12-16 18:37

@Falmarri我也从不使用!-#。我确实使用!string来运行以string开头的最后一个命令,但是通常我会先使用Tab键完成它(zsh),以确保运行正确的东西

– Michael Mrozek
2010-12-16 18:42

没有! :)“正在运行!N将运行命令...”的描述太狭窄了;实际上,!N将由命令...代替。对于答案中的所有说明,依此类推。更正确,打开更多有用的可能性!例如,提到的sudo !!。

– imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)
2011-3-16在1:34



要运行由字符串查找的先前命令,通常只需按Ctrl-R。多个Ctrl-R将更深入地了解历史。这样,我立即看到了找到的命令,可以将其丢弃并进一步查看。 Ctrl-G退出此模式。唯一的不便是Ctrl-R用于bash。在Emacs中,要浏览输入命令和值(用于M-x或其他读取值)的历史,请改用Meta-R(在Emacs中的eshell中也使用Meta-R)。所以我经常把它们弄乱。

– imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)
2011-3-16在1:45



#2 楼

bash-插入前一行的最终参数


再按一次以选择较旧的最后一个参数。

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

评论


您还可以使用!$引用上一个命令中的最后一个arg。这很有用,因为它既可以在脚本中也可以交互地工作。 (在bash和zsh中工作)

–杰里·H。
2010年8月10日在20:07

每次您按下alt-。它将转到上一个命令并从中拉出最后一个参数。因此,如果您想从三个命令之前获取最后一个参数,只需按alt-。三次。

–clee
10年8月20日在20:09

这是yank-last-arg readline命令的默认键绑定,因此它应与链接到readline的任何程序一起使用,而不仅仅是BASH或ZSH。

–詹姆斯·斯诺格(James Sneeringer)
2011年10月5日下午16:58

在vi模式下,我必须按照以下答案重新绑定yank-last-arg:superuser.com/questions/18498/…

–杰利姆·安格利姆
2011年10月8日13:14

在xterm中,meta-。产生®,但是您可以使用esc代替meta(通常在bash中使用),因此esc-。代替。

–德罗伯特
11年11月11日在22:01

#3 楼

我最喜欢的是

man 7 ascii


简单又非常有用。

   Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
   ────────────────────────────────────────────────────────────────────────
   000   0     00    NUL 'q4312078q' (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



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


CommandLineFu的十大一线作家解释了
CommandLineFu的下十个单行解释了
另外CommandCommandFu的十个单行了解释了
CommandLineFu的另外十个单行了解释了


评论


单独的ascii程序也很有用。除了打印表格外,它还可以查询一个或多个单个字符。

–马修·弗拉申(Matthew Flaschen)
2010年8月15日下午5:24

#4 楼

以root用户身份执行最后一个命令:

sudo !!


#5 楼

不确定这是否算作“技巧”,但是人们似乎并不了解标准的readline热键。在shell中特别有用:



Ctrl + U-剪切当前行

Ctrl + Y-用Ctrl + U粘贴剪切的行



评论


只需添加一些内容即可:Ctrl + A转到行的开头,Ctrl + E转到行的末尾,Ctrl-K删除从光标到行的末尾。

–rsuarez
2011年1月24日15:13



Ctrl + L对应于FormFeed ASCII字符。它通常会在带有屏幕窗口(例如vim,less,mc等)的文本应用程序中重绘屏幕。如果屏幕已被另一个程序的某些输出“污染”,那就很好。

–喜剧
2011-3-17在22:13

添加到热键列表中:Ctrl + W可以向后切一个单词,Alt + F可以向前切一个单词,Alt + B可以一行切向一个单词。我喜欢Ctrl + Y和Shift + Insert,因为您可以复制两条线。一个用Ctrl + U(用Ctrl + Y粘贴),同时您可以复制另一个单词(选择该行),用(Shift + Insert)粘贴。

–user14039
2012年2月24日19:26



#6 楼

BASH中的CTRL + R,用于搜索/激活先前执行的命令(〜/ .bash_history的内容)。

这通常非常有用。运行此别名将在端口8000上通过HTTP(索引)在PWD上提供服务: ,这些别名可能是我最常用的(严重):我用它将任何种类的内容都复制到我的Linode中,并将生成的HTTP URL复制到我的剪贴板(单击中键)。对于将内容粘贴到IRC中的人非常有用:

alias webserver="python -m SimpleHTTPServer"


只需几个。我可以在以后发布更多内容,必须恢复工作!

评论


alias mk = make键入速度更快,出错的可能性较小。或使用热键从编辑器进行编译...

–拉尔斯·豪格斯
2010年8月13日在5:29

BTW Zsh具有内置的拼写更正功能,非常适合纠正简单的错字。

–亚当·伯特克(Adam Byrtek)
2010-09-15 17:14

同样在zsh中,我认为默认值是当您按下向上键时它会进行历史搜索,就好像您已经按下ctrl r一样。可能不是默认值,但这是一个设置。

–法尔玛里
2010-12-16 18:40

我会考虑使用别名m = make,甚至可以考虑使用m = make -j6或类似的名称-除了我已经使用别名m = mutt☺

– jmtd
2011年5月10日12:54

#7 楼

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

diff <(ls dir1) <(ls dir2)


评论


这对于comm也非常有用,因为它仅接收文件,但是在许多情况下,这浪费了inode。

–马辛
2011年5月5日下午14:11

#8 楼

很基本,但人们似乎不知道,它使您返回到上一个目录:

cd -


评论


我告诉你,来自DOS的cd ..根深蒂固在我的肌肉记忆中...

–LawrenceC
2011-2-16在5:04

这是推入和弹出的便宜版本...

– Robert Massaioli
2011-2-17在21:30

同样,有cd(无参数)可将您带到主目录。

–美
2012年2月3日在23:57

是的,那太疯狂了。它在手册页的何处显示“-”的扩展名?我一直在尝试(并忘记)使用推/弹出

– Chuck R
2012年2月20日在22:02

#9 楼

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


它使您可以用较短的实例替换像以下这样的乏味的行:
mv loong/and/complex/file/name loong/and/complex/file/name.bacukup

其他用途

mv loong/and/complex/file/name{,backup}


算术扩展:


算术扩展允许评估算术表达式和结果替换。算术
扩展的格式为:括号没有特别处理。
表达式中的所有标记都经过参数扩展,字符串
扩展,命令替换和引号删除。算术扩展
可以嵌套。


# 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 


评论


很好,我简直不敢忘记。还有一个更紧凑的foo [123]将扩展为foo1 foo2 foo3,但是在这种情况下,它们必须是文件名才能使用

– Michael Mrozek
2010-09-23 14:31

呵呵..谢谢...每天学习一些东西+1

– Stefan
2010-09-29 20:19

#10 楼

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

shopt很好,请检查注释:保存击键的方法:
mkdircd放在其中: br />
shopt -s cdspell        # try to correct typos in path
shopt -s dotglob        # include dotfiles in path expansion
shopt -s hostcomplete   # try to autocomplete hostnames


评论


+1,为什么我没想到呢? (提取)

– MAK
2010-09-19的16:48

我有一个与mkcd类似的功能,只是我将其命名为id md。但是,使用“ $ @”作为cd的参数没有任何意义,因为您不能将cd到一个以上的目录中。 “ $ @”适用于mkdir,但是对于mkdir和cd来说,您处理参数的方式有所不同,因此我建议md(){mkdir -p“ $ 1”; cd“ $ 1”}

–喜剧
2011-3-17在22:20

如何添加这些命令?只是按原样粘贴到.bashrc或在它们之前添加“别名”?

– Asaf
11年11月18日在19:34

#11 楼

两种bash功能可以节省很多按键。

每成功执行一次cd后,就会自动执行一次ls: br />
function cd {
    builtin cd "$@" && ls
}


评论


我从未意识到您可以使用内置的foo来解决定义cd的功能;我一直在函数中使用chdir。便利

– Michael Mrozek
2010年8月11日下午13:39

太棒了只需在cd函数中将-F添加到ls,就完美了(对我而言)!

–frabjous
2010年8月22日在2:49

我对cd的处理与您相同,但是我进行了更多的健全性检查,避免在非交互模式下执行ls:cd(){内置cd-“ $ @” && {[“” $ PS1“ =”“ ] || ls -hrt --color; }; }

– jmtd
2011年5月10日下午14:27

#12 楼

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

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

我输入cd,然后按向上/向下按钮,我可以看到所有cd输入的选项。基本上,我将其用于常用的目录。就像“ cd w”一样,我最终要遍历所有我经常使用的工作空间。

评论


这个真的很棒!它扩展了箭头的行为,而没有破坏其基本功能。谢谢!

– philfr
2011-3-16在8:41

#13 楼

节省大量时间的一件事是push / popd命令。这些家伙使您可以创建目录堆栈并减少大量键入操作:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make


评论


是!别名u = pushd;别名o = popd

–灵长类动物罐头
2010年8月15日9:57

..你在这里代表什么?

– deizel
2010年8月19日,11:32



@deizel:没什么特别的,只是避免键入的快捷方式。

–亚当·伯特克(Adam Byrtek)
2010-09-15 17:15

看起来像命令的第二个字母,因为它们都以p开头,所以不能同时使用它们。

– camh
2010-09-16 10:20

在ZSH中,您可以设置setopt autopushd,所有目录更改将自动推送

– Michael Mrozek
2010-09-23 14:34



#14 楼

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

如果使用screen,则此shell函数(将其放入.bashrc中)非常有用:如果您的主要会话存在并将附加到它。否则它将创建它。

评论


从技术上讲,它是自己的程序,而不是“命令”。

–mike3996
2011年3月15日上午11:00

我建议在屏幕上使用tmux或dvtm。它们是更现代,更清洁的替代品。

– deltaray
2011-11-20 3:59



是的,“ tmux”无疑比屏幕好得多。

– ColinM
2012年3月2日在21:38

它也更严格地遵循直觉,缩写名称的unix约定:)

–user394
2012年3月5日15:00

#15 楼

如果需要在bash中编辑特别长的命令行,请在编辑器($ EDITOR)中将其打开。

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

^X^E (Ctrl-X Ctrl-E) 


评论


哇,那本书进了。

–l0b0
2011年6月20日13:29

是的,进入我的笔记!

– jyz
2011年7月1日在0:28

#16 楼

如果您是快速打字员,这些将派上用场:

alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'


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

total ()
{
        if [ x = x ]; then set `echo 1`; fi
        awk "{total += $} END {print total}"
}


例如使用这种方式,不带任何参数,它将第一列的总数相加:

du | total


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

ls -l /tmp/*cs | total 5


有时由于不小心查看了二进制文件(例如,cat / bin / ls)而使控制台混乱,您可以使用此shell函数恢复终端:

restaura ()
{
    perl -e 'print "\e)B";'
}


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

alias ls='ls -FB'


评论


不要忘记:alias gerp ='grep --color = tty'我一直都这样做;-)

–罗伯特·斯威舍(Robert Swisher)
2010年8月24日在22:19

就我而言,如果我不准确,“快速”就不算在内。您可能还需要查看GREP_COLORS和GREP_OPTIONS变量。

–安迪·莱斯特(Andy Lester)
2010-10-8 22:58

s /快速/草率/

–乔什
2010年12月14日16:00

我在使用restaura的地方使用了reset。

– jmtd
2011年5月10日13:04

#17 楼

alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.


我忘记了我的最爱之一s

$ s !! # last command with super user priviledges


评论


如果使用ZSH,则可以执行诸如bindkey -s'\ e [12〜'“ sudo !! \ n”之类的操作来绑定(在这种情况下)F2以运行该命令。我具有该绑定,因此当我运行某些命令并看到“您忘记了'sudo',傻瓜”错误消息时,我可以烦恼地刺入F2

– Michael Mrozek
2010年8月10日19:50



F2键差....)

–Eimantas
2010年8月10日19:55

我经常用这个。我经常忘记在编辑主机文件之前输入sudo。如果发生这种情况,我只需运行sudo !!。 +1

–布莱恩·威金顿
2011年1月13日22:16

#18 楼

如果命令接受标准输入,则可以使用<filename从文件中读取输入。它可以出现在命令的任何位置,因此这些行是等效的:

cat filename
cat <filename
<filename cat


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


评论


一个很好的提示!值得一提的是,这实际上并没有将命令的参数重新排序。而是将文件通过管道传输到进程的STDIN中,因为grep现在没有文件参数,它默认为从STDIN读取。理解这一点将为将这种技术与其他命令结合使用提供许多机会,并且还可以帮助人们了解在事情无法按预期进行时的情况。有关更多信息,请查找管道和重定向器:dsj.net/compedge/shellbasics1.html

–寒颤
2010年8月10日在20:23

@chill好点;提示实际上措辞很差,以至于本质上是错误的。我根据您的评论重写了它

– Michael Mrozek
2010年8月10日20:34

我最近发现的一些信息:您可以将输入重定向到循环(for,while等)。参见faqs.org/docs/abs/HTML/redircb.html。

–卢卡斯·琼斯(Lucas Jones)
2010年8月11日上午10:41

通常,将重定向放在最后。使用 output,如果您尝试在某些shell循环原语(如while或for中间)中进行混合,则此输出将不起作用。所以我放弃了,只是按照惯例将其放在最后。

– jmtd
2011年5月10日13:07

@jmtd好了,将其放在最后可以消除“这对于grep尤其有用,因为它允许您将表达式放在行的末尾,因此您可以通过单击Up来快速修改它的grep命令,而无需滚动离开文件名”

– Michael Mrozek
2011年5月10日13:42

#19 楼

您可以使用CDPATH来设置等效于PATH的目录;如果尝试cd foo并且当前目录中没有foo,则外壳程序将检查CDPATH中的每个目录,以在其中查找foo,然后切换到找到的第一个目录:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise


评论


这可能会导致问题。请参阅softpanorama.org/Scripting/Shellorama/cdpath.shtml“如果设置了$ CDPATH,则cd内置将不会隐式地将当前目录附加到该目录。这意味着如果无法从任何目录构造有效目录名,则cd将失败。即使在当前目录中存在与$ cdPATH条目相同的目录,即使该目录的名称与作为cd参数的名称相同。我为此感到痛苦,一些Makefile停止工作了。追加中。虽然显然可能有所帮助,但是与此同时也存在一些问题。

–ustun
2010年8月19日在9:22

#20 楼

vi `which scriptname`


当您不知道某物在哪里居住时,您也不在乎。

评论


我并不是要继续插入ZSH功能,而是在其他人回答:)时一直在思考它们。在ZSH中,您可以执行= foo来自动调用它,因此vi = scriptname

– Michael Mrozek
2010年8月10日在19:58

如果您在查找反引号字符时遇到问题,也可以使用$(scriptname)

–帕特里克(Patrick)
2010-10-16 8:20

#21 楼

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

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

评论


而且,如果您的应用程序是GUI,则可能不希望它继续存在。附加&!为工作提供背景并从外壳中将其删除!

–mike3996
2011-3-15在11:01

@progo:在bash中这对我不起作用。

–内森·奥斯曼(Nathan Osman)
2011年5月6日在2:07

@乔治。看来你是对的。我确实了解到zsh支持它,后来听说bash也支持它。天啊 :(

–mike3996
2011年5月6日下午4:28

@progo:事实证明,在命令前面加上nohup即可完成此操作。

–内森·奥斯曼(Nathan Osman)
2011年5月6日下午6:37

#22 楼

制表符完成。如果必须输入每条路径的所有字符,效果会很糟吗?

评论


有自杀的Linux。如果您输入的命令不正确-rm -fr /。是的,制表符完成非常重要...

–Eimantas
2010年8月21日在4:58

并不像您想的那样糟糕(但仍然很糟糕),您只是在各处撒了通配符:ls / usr / lib / game-d * / rott *

– jmtd
2011年5月10日13:08

@Eimantas在大多数Linux系统中不是rm -rf /禁用吗?

– Bernhard Heijstek
2011年7月9日在7:02

@phycker-我提到Suicide Linux,不是“全部”。

–Eimantas
2011年7月10日在14:25

#23 楼

卸载上次安装的设备:

mount /media/whatever
...
u!mo


!mo扩展到以mo开头的最后一个命令(至少在bash中)。
有时一个在中间执行mv ,因此u!m将无法正常工作。

评论


为了安全起见,请使用Ctrl + Shift + 6(Ctrl + ^)展开命令而不运行该命令

– ColinM
2012年3月2日21:48

#24 楼

我在我的.bashrc中有此内容。

#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'

并想找到我使用的所有链接

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


剪贴板中有所有网址

我也有此功能

c-v | find-all 'href="([^"]*)"' | c-c


,显示大小(人类可读)和文件名。 br />
function lsq(){
    ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}


使用此函数,我可以计算乘积或参数和。通过正则表达式输入,然后加入结果。 DNS

我也有三种颜色功能

alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'




function separate() {
    python -c "import sys,re; print ''.join(re.split('\s*', sys.stdin.read().strip()))";
}


此函数验证文件md5哈希。

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

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

function split-join() {
    python -c "import sys,re; print ''.join(re.split('', sys.stdin.read().strip()))";
}


您可以使用

function factorial() {
    seq -s*  | bc
}

打印所有消息

#25 楼

ZSH的另一个有用技巧:将命令的输出作为文件处理:

emacs =(hg cat -r 100 somefile)


这将打开旧版本的Mercurial跟踪emacs中的文件以进行语法突出显示。否则,我将不得不弄乱hg reverthg archive或将hg cat的输出显式发送到一个临时文件。标准输出。

评论


您可以使用<()在bash中执行此操作

–ScaryAardvark
2010年8月11日,9:45

#26 楼

ZSH特有的功能是后缀别名,可通过给alias标志-s标志来设置:直接扩展,ZSH将启动给定程序并将文件名作为参数传递。因此,如果上述别名有效,则这些行是等效的:

alias -s ext=program


评论


这是我在Windows上真正想念的一件事……直到我意识到“程序”始终是emacs,所以我停止使用shell打开文件,而只是使用C-x C-f(duh)。

– Harpo
2011-2-16在4:11

#27 楼

我一直以来最喜欢的ZSH功能之一是命名目录。您可以导出具有给定名称的变量,并且该变量的值指向特定路径:

export foo=/usr/bin


评论


如果您的提示显示了当前的工作目录,据我所记得,变量的名称也将在此处使用。

–安德烈·霍尔兹纳(Andre Holzner)
2011年6月18日下午16:34

#28 楼

看到这个问题。
当您运行ps ax | grep string时:
[steve@sage-arch ~]$ ps ax | grep 'openbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 5100 pts/0    S+     0:00 grep openbox

包含grep的最后一行有点烦人
您可以通过运行ps ax | grep '[s]tring'摆脱自己:
[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session


更新:或只运行pgrep string

评论


是的,非常有用您应该引用openbox('[o] penbox')。方括号将像glob一样起作用,因此,如果目录中存在openbox(例如,您在/ usr / bin中),bash将仅使用openbox,这将防止grep欺骗。

– Rich Homolka
2010-10-21 19:58



#29 楼



不执行命令:,如

while :; do :; done



括号扩展与for循环结合使用:

for c in {1..3}; do :; done



!操作员和短路操作员||&&

[ -d /tmp/dir ] || mkdir /tmp/dir

if ! ping 34.41.34.1; then :; fi



使用子壳代替pop / push的功能(在脚本中非常有用)


也非常好:这里字符串

~$ ( cd /tmp; echo $PWD )
/tmp
~$



和我的最爱:重定向命令列表

~$ type type
type is a shell builtin
~$ type ls
ls is aliased to `ls --color=auto'
~$ f(){ :; }
~$ type f
f is a function
f () 
{ 
     :

}




#30 楼

我喜欢把尽可能多的东西塞进我的PS1中。需要记住一些有用的事情:

\e[s\e[u分别保存和取消保存光标位置。我用它在屏幕顶部创建了一个“信息栏”,该栏长了几行,可以容纳更多东西。示例:

PS1='\[\e[s\e[7m\e[1;1H\]\w\n\t        \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\W]\[\e[0m\]$ '

alias clear='echo -e "\e[2J\n"'结合。试试吧!

PROMPT_COMMAND变量还定义了一条每次在PS1之前执行的命令。

另一个是bg命令。如果忘记将&放在命令末尾,只需按^ Z并键入bg,它就会在后台运行。

评论


感谢bg,当我有一个程序在后台运行并且不小心按fg时,我不知道如何将其推回:D

– phunehehe
2010年8月11日在7:15

我喜欢干净的PS1,所以我将大部分想要的东西放到了屏幕的底线...

–乔什
2010-12-14 16:16