shell技巧分享(三)

13 Apr 2018 shell技巧分享(三)

这是一个系列文章,主要分享shell(部分功能仅适用于bash)的使用建议和技巧,每次分享3点,希望你能有所收获。

1 交互模式时自动输入

$ pip uninstall redis
Uninstalling redis-2.10.6:
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/DESCRIPTION.rst
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/INSTALLER
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/METADATA
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/RECORD
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/WHEEL
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/metadata.json
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/top_level.txt
  /usr/lib/python2.7/site-packages/redis/__init__.py
  /usr/lib/python2.7/site-packages/redis/__init__.pyc
  /usr/lib/python2.7/site-packages/redis/_compat.py
  /usr/lib/python2.7/site-packages/redis/_compat.pyc
  /usr/lib/python2.7/site-packages/redis/client.py
  /usr/lib/python2.7/site-packages/redis/client.pyc
  /usr/lib/python2.7/site-packages/redis/connection.py
  /usr/lib/python2.7/site-packages/redis/connection.pyc
  /usr/lib/python2.7/site-packages/redis/exceptions.py
  /usr/lib/python2.7/site-packages/redis/exceptions.pyc
  /usr/lib/python2.7/site-packages/redis/lock.py
  /usr/lib/python2.7/site-packages/redis/lock.pyc
  /usr/lib/python2.7/site-packages/redis/sentinel.py
  /usr/lib/python2.7/site-packages/redis/sentinel.pyc
  /usr/lib/python2.7/site-packages/redis/utils.py
  /usr/lib/python2.7/site-packages/redis/utils.pyc
Proceed (y/n)? y
  Successfully uninstalled redis-2.10.6
$ pip install redis
Collecting redis
  Using cached redis-2.10.6-py2.py3-none-any.whl
Installing collected packages: redis
Successfully installed redis-2.10.6
$ echo y | pip uninstall redis
Uninstalling redis-2.10.6:
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/DESCRIPTION.rst
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/INSTALLER
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/METADATA
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/RECORD
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/WHEEL
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/metadata.json
  /usr/lib/python2.7/site-packages/redis-2.10.6.dist-info/top_level.txt
  /usr/lib/python2.7/site-packages/redis/__init__.py
  /usr/lib/python2.7/site-packages/redis/__init__.pyc
  /usr/lib/python2.7/site-packages/redis/_compat.py
  /usr/lib/python2.7/site-packages/redis/_compat.pyc
  /usr/lib/python2.7/site-packages/redis/client.py
  /usr/lib/python2.7/site-packages/redis/client.pyc
  /usr/lib/python2.7/site-packages/redis/connection.py
  /usr/lib/python2.7/site-packages/redis/connection.pyc
  /usr/lib/python2.7/site-packages/redis/exceptions.py
  /usr/lib/python2.7/site-packages/redis/exceptions.pyc
  /usr/lib/python2.7/site-packages/redis/lock.py
  /usr/lib/python2.7/site-packages/redis/lock.pyc
  /usr/lib/python2.7/site-packages/redis/sentinel.py
  /usr/lib/python2.7/site-packages/redis/sentinel.pyc
  /usr/lib/python2.7/site-packages/redis/utils.py
  /usr/lib/python2.7/site-packages/redis/utils.pyc
Proceed (y/n)?   Successfully uninstalled redis-2.10.6

有时候执行命令会进入交互模式,需要根据输入作出不同响应。如果我们提前知道需要输入的字符没有风险,那么可以通过echo命令将字符直接传递给命令,避免进入交互模式耽搁时间。比如示例中通过pip命令卸载redis包时,就会让用户输入y或者n,然后根据输入进行下一步操作。借助echo命令,可以避免进入交互模式,命令快速执行完毕。再次提醒,前提是你知道输入的字符没有风险,比如不要随便给rm命令echo一个y。

2 运行c代码

$ cat helloworld.c

#include <stdio.h>

int main ()
{
    printf("hello world!\n");
    return 0;
}
$ gcc helloworld.c -o helloworld
$ ./helloworld
hello world!
$ ls | grep helloworld
helloworld
helloworld.c
$ crn helloworld.c
hello world!
$ ls | grep helloworld
helloworld
helloworld.c

定义的crn函数如下:

crn(){
    gcc $* -g;
    if [ $? -ne 0 ]; then
        echo "failed to build $1"
    else
        ./a.out
        rm -rf ./a.out
    fi
}

在linux命令行,要运行一个c程序,需要先编译c代码,然后才能运行该程序。使用go语言运行go代码时,发现go可以直接运行源代码,于是有所启示,我定义一个crn函数,该函数参数是c源代码文件,crn命令会先编译c代码,然后执行编译后的可执行程序,执行完毕后将可执行程序删除,省去了编译环节,更加快速的执行c源程序。例如示例中,执行crn helloworld.c命令就可以运行该c源代码,确实方便不少。

3 解压常见格式的压缩包

ltar(){
if [ -f $1 ]; then
case $1 in
    *.tar.bz2) tar xjf $1;;
    *.tar.gz) tar zxvf  $1;;
    *.bz2) bunzip2 $1 ;;
    *.rar) unrar e $1 ;;
    *.gz) gunzip $1 ;;
    *.tar) tar xf $1 ;;
    *.tbz2) tar xjf $1 ;;
    *.tgz) tar xzf $1 ;;
    *.zip) unzip $1 ;;
    *.Z) uncompress $1 ;;
    *.7z)7z x $1 ;;
    *) echo "'$1' cannot be extracted";;
esac
else
    echo "'$1' is not a valid file"
fi
}
$ ls
gz_file.tar.gz  tar_file.tar
$ ltar tar_file.tar
$ ltar gz_file.tar.gz

日常工作中,经常需要解压不同格式的压缩包,但是压缩格式有很多种,每种压缩格式的解压选项和命令行有可能不一样,要记住那么多解压命令和选项实在不容易。通过定义一个函数ltar,将常见压缩格式文件的解压命令都封装在该函数内部,实现一键解压,例如示例中执行ltar tar_file.tar命令和ltar gz_file.tar.gz命令都能解压相应的压缩文件。

LEo at 23:35

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闵开慧

tomcat6.0下找不到jasper-runtime.jar

今天有点需求,需要用jasper-runtime.jar包。但是我在我的\apache-tomcat-6.0.16\lib目录下,怎么也找不到这个jar包。结果...

3215
来自专栏架构师之路

一分钟实现分布式锁

一、缘起 分布式环境下,多台机器上多个进程对一个数据进行操作,如果不做互斥,就有可能出现“余额扣成负数”,或者“商品超卖”的情况,如何实现简易分布式锁,对分布式...

4076
来自专栏DOTNET

Entity Framework——配置文件设置

可以使用配置文件或代码(EF6起)配置EF框架。 一、使用配置文件 安装Entity Framework自动生成的配置 当使用VS的NuGet自动安装Entit...

3245
来自专栏北京马哥教育

ls 命令还能这么玩?看一下这 20 个实用范例

1974
来自专栏JackeyGao的博客

Django 自定义管理命令

Django 提供了一组非常实用的命令, 可以通过django-admin.py和pytohn manage.py脚本调用. 关于这个Management Co...

1812
来自专栏北京马哥教育

29 条运维工程师必会实用 Linux 命令

虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单...

2999
来自专栏QQ音乐技术团队的专栏

ContentProvider简介

(一) 基础知识 Content Provider属于Android四大组件之一,相比较而言,它更侧重于共享数据。Android的数据存储方式有以下几种:...

2806
来自专栏抠抠空间

Linux用户管理

3010
来自专栏C/C++基础

g++入门教程

g++是GNU开发的C++编译器,是GCC(GNU Compiler Collection)GNU编译器套件的组成部分。另外,gcc是GNU的C编译器。

1.2K1
来自专栏web编程技术分享

小兔Java教程 - 三分钟学会Java文件上传

44712

扫码关注云+社区

领取腾讯云代金券