shell-tricks

Simple bash tricks which make your life easier.
授权协议 Readme
开发语言 SHELL
所属分类 应用工具、 终端/远程登录
软件类型 开源软件
地区 不详
投 递 者 严宇
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Shell tricks

Switch to previous directory

Switch between the current and previous branch / directory.

git

$ git branch
* master
development

$ git checkout development
Switched to branch 'development'
$ git checkout - # Switch to previous
Switched to branch 'master'
$ git checkout -
Switched to branch 'development'

cd

$ pwd
/
$ cd /tmp
$ cd - # Switch to previous
/
$ cd -
/tmp

Get global ip

$ curl ifconfig.co # IPv4
50.110.14.21
$ curl -6 ifconfig.co # IPv6
2010:3f3f:113f:0:ea57:4497:7291:e422

Simple commands

Create a script which calls functions by its` first argument. This is very useful to create simple scripts which could be a wrapper for other commands.

#!/usr/bin/env bash

function do_this () { echo "call do_this function"; }

function do_sth() { echo "call do_sth function" }

case "$1" in
    do_this|do_sth) "$1" ;;
esac

Execute it:

$ ./simple-commands.sh do_this
call do_this function

Loop

Write simple one liner loops if you need to do some batch tasks.

$ for i in {1..10}; do echo "$i"; done

# List disk usage by directories
$ for file in */ .*/ ; do du -sh $file; done

Loop with specified increment each iteration

for i in {1..100..2}; do echo $i; done
1
3
5
7
...

Sequences of letters or numbers

Brace expansion is great for lots of things.

$ touch file{a..c}
$ ls
$ command ls
filea fileb filec
$ touch file-{1..15}
$ ls
file-1	file-10	file-11	file-12	file-13	file-14	file-15	file-2	file-3	file-4	file-5	file-6	file-7	file-8	file-9
$ ls file-{9..12}
file-10	file-11	file-12	file-9
$ printf "%s\n" file-{a..c}{1..3}
file-a1
file-a2
file-a3
file-b1
file-b2
file-b3
file-c1
file-c2
file-c3

(If you give printf more arguments than it expects, it automatically loops.)

Reuse arguments

$ ls /tmp
some_file.txt some_archive.tar.gz
$ cd !$
/tmp

Reuse commands

$ echo "reuse me"
reuse me
$ !!
echo "reuse me"
reuse me

Compare output of two commands

diff <(echo "1 2 4") <(echo "1 2 3 4")
1c1
< 1 2 4
---
 > 1 2 3 4

Fix last command

$ ehco foo bar bar
bash: ehco: command not found
$ ^ehco^echo   
foo bar baz

Accept interactive commands

$ yes | ./interactive-command.sh
Are you sure (y/n)
Accepted
yes: standard output: Broken pipe

The error message is printed because yes gets killed by SIGPIPE signal. This happensif the pipe to ./interactive-command.sh gets closed but yes still wants to write into it.

Ignore error message:

$ yes 2>/dev/null | ./interactive-command.sh

Last exit code

$ ls /tmp
some_file.txt
$ echo $?
0

Easy backup

$ cp file.txt{,.bak}
$ ls -1
file.txt
file.txt.bak

Print to stderr

$ >&2 echo hello
hello

Debugging

Add -xv to your bash scripts, i.e.:

/usr/bin/env bash
set -xv

or /bin/bash -xv script.sh

Useful readline tricks

If you use the standard bash readline bindings.

  • C-a (aka CTRL+A) move cursor to beginning of line
  • C-e (aka CTRL+E) move cursor to end of line
  • M-. (aka ALT+.) insert last argument of previous command (like !$, but you can edit it)

Repeat command

Execute a command every two seconds and monitor its` output.This is especially useful for waiting until a deployment or infrastructure provisioning is completed, i.e. on aws.

watch -n2 echo hello`

Substrings

$ a="apple orange"

$ echo ${a#* }
orange
$ echo ${a#*p}
ple orange
$ echo ${a##*p}
le orange

$ echo ${a% *}
apple
$ echo ${a%p*}
ap
$ echo ${a%%p*}
a

The # for finding first occurence from the start and % for the first occurence from the end. * for matching any pattern. For greedy matching ## and %%.

More resources

  • BashFAQ - A full FAQ of useful stuff
  • 1. bash支持关联数组(到了这么复杂的程度,用python吧): declare -A map # define an associated array (hash map), this is supported by bash >= 4.1.2 map[k1]=v1; map[k2]=v2; echo ${map[k1]} #v1 ${!a[@]} # the keys in the ass

  • Apache HBase Shell是(J)Ruby的IRB,添加了一些HBase特定命令。 你可以在IRB中做任何事情,你应该可以在HBase Shell中做。 要运行HBase shell,请执行以下操作: $ ./bin/hbase shell 键入help,然后键入以查看shell命令和选项的列表。 至少浏览帮助输出末尾的段落,了解如何将变量和命令参数输入HBase shell; 特别

  • 目录 由于正在进行深度学习的研究,主要用的语言是python. 在实际写程序的过程中, 经常会遇到一些技巧性的东西,特此下来来并且不断更新, 如果有任何疑问, 麻烦在下方留言或者联系邮箱 strikerklaas@gmail.com. C cross-entropy why use cross-entropy as loss? It is superior to the Mean Square E

  • 命令执行的坑其实早就想填了。最早是因为校赛时,easyphp一题自己因为不熟悉命令执行的一些特性导致套娃题绕到最后一层却没拿到flag。当时十分不爽,下定决心要好好了解下命令执行的相关知识点。 关于命令执行我大体上归为php绕过+rce两类。php的难点主要是在绕过写shell上,而linux的知识主要在RCE达成上。 先从简单说起: linux 命令& RCE rce,即remote comma

  • 暂时来讲,这是最后一篇关于 cmdr 的系列介绍文章了。 所有这个系列包括: 另一个go命令行参数处理器 - cmdr cmdr 02 - 复刻一个 wget cmdr 03 - 用流式接口定义命令行参数处理选项 cmdr 04 - 简单微服务 cmdr 05 - 扫尾 - Tricks/Walks/Hooks 这一次的内容算是杂烩乱炖。 Tricks ~~debug 已经在前文讲述过了。这里不再

  •   Why the following not working echo "hello" | read  var echo $var     Refer file:   http://www.etalabs.net/sh_tricks.html   Reading input line-by-line IFS= read -r var This command reads a line of in

  • Tips & Tricks Vagrantfile是一种非常灵活的配置格式。因为它只是Ruby,所以你可以用它做很多事情。然而,同样的道理,因为它是Ruby,所以有很多方法可以朝自己的脚开枪(即伤到自己)。在使用本页上的一些提示和技巧时,请注意正确使用它们。 1.Loop Over VM Definitions 循环实现虚拟机定义 如果你想对许多多机机器应用稍微不同的配置,可以使用循环来实现这一点

  • Redirection It's common to see "2>&1" in shell command. This is used for redirect std err to std out.

  • 目录 修改配置项的值 读取配置项的值 替换/修改 在匹配行行首/行尾添加字符(#) 去掉匹配行行首/行尾字符(#) #匹配行前加 #匹配行后加 #匹配行前后加 删除匹配行 替换/删除匹配的字符之间的内容 按行读取配置获取参数执行命令|shell读取配置文件 删除空格 如何在sed中使用变量 第一 第二 修改配置项的值 multi_cluster_set_ha = yes 改为multi_clust

 相关资料
  • Shell排序是一种高效的排序算法,基于插入排序算法。 该算法避免了大的移位,如插入排序的情况,如果较小的值是最右边的并且必须移动到最左边。 该算法对广泛传播的元素使用插入排序,首先对它们进行排序,然后对间距较小的元素进行排序。 该间距称为interval 。 此间隔基于Knuth的公式计算为 - Knuth的公式 h = h * 3 + 1 where − h is interval wi

  • shell 模块提供了集成其他桌面客户端的关联功能. 在用户默认浏览器中打开URL的示例: var shell = require('shell'); shell.openExternal('https://github.com'); Methods shell 模块包含以下函数: shell.showItemInFolder(fullPath) fullPath String 打开文件所在文

  • 使用默认应用程序管理文件和 url。 进程: Main, Renderer shell 模块提供与桌面集成相关的功能。 在用户的默认浏览器中打开 URL 的示例: const { shell } = require('electron') shell.openExternal('https://github.com') Manage files and URLs using their defau

  • Erlang shell用于测试表达式。 因此,在实际测试应用程序本身之前,可以非常轻松地在shell中进行测试。 以下示例展示了如何在shell中使用加法表达式。 这里需要注意的是表达式需要以点(。)分隔符结束。 执行命令后,shell会打印另一个提示符,这次是命令编号2(因为每次输入新命令时命令编号都会增加)。 以下函数是Erlang shell中最常用的函数。 b() - 打印当前变量绑定。

  • 可能您早已能够熟练的使用 GUI(图形用户界面),例如您可以使用鼠标双击一个图标,来打开或者执行它。 我们来看这个过程: 您使用鼠标定位桌面上的一个程序图标,按下左键两次。系统读取鼠标指针的位置,并且判断该位置下图标的涵义,根据预设的双击动作,运行程序或者打开文件。 这一套 GUI 系统,便是一种 Shell,它的作用是实现人机交互。如果我们不能够控制电脑,那么电脑还不如电视机好玩,不是么?电视机

  • 使用默认应用程序管理文件和 url。 Process: Main, Renderer (只能在非沙盒下使用) shell 模块提供与桌面集成相关的功能。 在用户的默认浏览器中打开 URL 的示例: const { shell } = require('electron') shell.openExternal('https://github.com') 注意: 虽然 shell 模块可以在渲染

  • Centos运维常用工具 前言 本工具集包含有系统内核参数优化,ssh证书登录,网卡聚合,mongodb/mysql数据库安装,网络监控以及J2EE开发常用工具安装。以上工具集均为centos中常用的配置与工具,经过本人上一份工作,运维20多台分布式服务器,安装过50次以上linux的实践经验,收集整理出这套常用的服务器管理配置,在我后续的工作中发挥了巨大的价值,提升了N倍工作效率。当然这个过程中

  • Erlang shell 被用于表达式的测试。因此,测试可以在 shell 进行,这是在实际的应用程序运行之前进行测试。 下面的例子展示了如何在 shell 中添加表达式并使用。这里需要指出的是,表达需要使用(.)定界符来作为结束符。 执行该命令后,shell 打印出另一个提示,此时为命令编号为2(因为指令数在每次输入新命令后增加)。 以下函数在 Erlang Shell 最常见的。 b() −