有用的 Bash 别名和函数简介

简介

随着你在命令行上的操作越来越多,你会发现你使用的大部分命令只是可用命令的一个非常小的子集。大多数任务是习惯性的,你可能每天都以相同的方式运行这些任务。

虽然许多常见命令实用程序的制造者已经尝试通过使用缩短的名称(想想每天通过输入"ls"而不是"list"和"cd"而不是"change-directory"来节省多少按键),来消除多余的输入,但这并不是普遍的。此外,许多人每次运行命令时总是启用相同的几个选项。

幸运的是,bash允许我们通过别名和shell函数来创建自己的快捷方式和时间节省器。在本指南中,我们将讨论如何利用这些功能,并为您提供一些有用的示例,以帮助您朝着正确的方向开始。

如何声明Bash别名

在bash中声明别名非常简单。它非常容易,你现在就应该尝试一下。

您可以通过简单地在命令行中输入以下内容来声明在整个shell会话期间持续存在的别名。语法如下:

alias 别名="要运行的命令"

请注意,相邻元素和等号之间没有空格。这是不可选的。这里的空格会破坏命令。

现在让我们创建一个常见的bash别名。许多人经常使用的一个成语命令短语是 ls -lhals -lhA(第二个省略了当前目录和父目录的列表)。我们可以创建一个名为 ll 的快捷方式,可以通过以下方式调用:

alias ll="ls -lhA"

现在,我们可以输入 ll,就会得到当前目录的列表,以长格式显示,包括隐藏目录:

ll

-rw-r--r-- 1 root root 3.0K Mar 20 18:03 .bash_history
-rw-r--r-- 1 root root 3.1K Apr 19  2012 .bashrc
drwx------ 2 root root 4.0K Oct 24 14:45 .cache
drwx------ 2 root root 4.0K Mar 20 18:00 .gnupg
-rw-r--r-- 1 root root    0 Oct 24 17:03 .mysql_history
-rw-r--r-- 1 root root  140 Apr 19  2012 .profile
drwx------ 2 root root 4.0K Oct 24 14:21 .ssh
-rw------- 1 root root 3.5K Mar 20 17:24 .viminfo

如果要取消别名,只需使用 unalias 命令:

unalias ll

别名现在已被移除。

您可以通过不带任何参数传递 alias 命令来列出所有配置的别名:

alias

要临时绕过别名(比如我们将 ls 别名为 ls -a),我们可以输入:

\ls

这将调用我们路径中找到的正常命令,而不使用别名版本。

假设您没有取消它,ll 别名将在当前shell会话期间始终可用,但当您打开新的终端窗口时,它将不可用。

要使其持久化,我们需要将其添加到在shell会话开始时读取的各种文件之一。常见选择是 ~/.bashrc~/.bash_profile。我们只需要打开文件并在那里添加别名:

nano ~/.bashrc

在底部或任何您喜欢的地方,添加您在命令行中添加的别名。随时添加一个注释,声明一个专门用于bash别名的整个部分:

#########
# 别名
#########alias ll="ls -lhA"

这个别名或其变体实际上可能已经在您的文件中。许多发行版都附带了一组标准的bash配置文件,其中包含一些有用的别名。

保存并关闭文件。您添加的任何别名将在下次启动新的shell会话时可用。要将您在文件中做出的任何更改读入当前会话,只需告诉bash现在重新读取文件:

source ~/.bashrc

别名示例

现在您知道如何创建自己的别名了,让我们谈谈一些可能对您有用的常见别名。这些可以在网上找到,有些也可能包含在您发行版的默认bash配置中。

导航和列表

许多最简单的Linux命令在应用一些格式和选项时更有帮助。

我们上面讨论了一个 ls 示例,但还有许多其他您可能会发现的。

通过默认显示为列和带有文件类型指示符(以"/"结尾的目录等),使 ls 更易于使用:

alias ls="ls -CF"

我们还可以预期一些拼写错误,以便调用正确的命令:

alias sl="ls"

让我们还创建一个别名,将我们的输出管道到 less,以便查看长格式的大型目录列表:

alias lsl="ls -lhFA | less"

我们也可以远离 ls,尝试一些对 cd 有帮助的命令。

这个命令将切换到父目录,即使您忘记了空格:

alias cd..="cd .."

您还可以通过为 .. 创建别名来完全省略 cd 部分:

alias ..="cd .."

我们可以通过设置这个别名轻松地在当前目录中找到文件:

alias fhere="find . -name "

系统别名

我们可以为一些监控和系统统计命令设置别名,因为每次调用时都使用相同的选项,所以最好设置一些别名。

以下命令将以人类可读的单位列出磁盘使用情况,包括文件系统类型,并在底部打印总计:

alias df="df -Tha --total"

我们也可以为我们首选的 du 输出添加一个别名:

alias du="du -ach | sort -h"

让我们继续朝着同样的方向,使我们的 free 输出更加人性化:

alias free="free -mt"

我们可以对进程表进行很多操作。让我们首先设置一个默认输出:

alias ps="ps auxf"

我们可以创建一个别名,用于在我们的进程中搜索我们将传递的参数:

alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"

现在,当我们使用进程名称作为参数调用它时,我们将获得一个简洁的输出:

psg bash
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1001      5227  0.0  0.0  26320  3376 pts/0    Ss   16:29   0:00 bash

其他别名

我们经常使用 mkdir 命令的一个常见选项是 -p 标志,以创建必要的父目录。我们可以将其设置为默认值:

alias mkdir="mkdir -p"

我们可能还想在此基础上添加一个 -v 标志,以便在每次目录创建时告知我们,这有助于快速识别是否由于拼写错误导致了意外的目录分支:

alias mkdir="mkdir -pv"

在使用 wget 从互联网下载文件时,几乎在所有情况下,您都会希望传递 -c 标志,以便在出现问题时继续下载。我们可以通过以下方式设置:

alias wget="wget -c"

我们可以像使用 history 命令的输出一样轻松地搜索我们的历史记录。这有时比使用 CTRL-R 进行反向搜索更有用,因为它会给您命令编号,以便在之后进行更复杂的调用:

alias histg="history | grep"

我有一些系统工具,我更喜欢从标准版本升级到更复杂的工具。这些只有在下载了所需的实用程序后才能使用,但它们非常有帮助。请记住,这可能会影响您的其他别名。

以下命令将用增强版本取代传统的 top 命令,该版本更加易于阅读,并且可以进行排序、搜索和滚动而无需复杂操作:

alias top="htop"

类似地,ncdu 命令可以下载,它以交互式的 ncurses 显示形式呈现文件和目录大小,您可以浏览并执行简单的文件操作:

alias du="ncdu"

还有一个名为 pydfdf 的升级实用程序。它提供了彩色输出和基于文本的使用情况条形图。如果有的话,我们可以默认使用此实用程序:

alias df="pydf"

您是否曾经需要在命令行中获取您在 NAT 路由器后的公共 IP 地址?类似这样的命令可能会很有用:

alias myip="curl http://ipecho.net/plain; echo"

出于自己的目的,我喜欢优化我上传到文章中的图像,使其宽度不超过 690px,因此我使用 ImageMagick 包(如果尚未安装,请执行 sudo apt-get install imagemagick)其中包含一个名为 mogrify 的命令来实现这一点。我在我的 ~/.bashrc 文件中有这个命令:

alias webify="mogrify -resize 690\> *.png"

这将调整当前目录中所有的 PNG 图像,只有当它们的宽度超过 690px 时才会调整。

如果我需要将它们上传到服务器,我可以使用 sftp 连接并自动切换到特定目录:

alias upload="sftp username@server.com:/path/to/upload/directory"

使用 Bash 函数入门

尽管别名快速且易于实现,但它们在范围上相当有限。您会发现,在尝试将命令链接在一起时,很难很好地访问运行时给定的参数,等等。有时别名也可能相当慢,因为它们是在所有函数之后读取的。

别名的替代方案是更健壮的,并且可以帮助您弥合别名和完整 shell 脚本之间的差距。这些被称为 shell 函数。它们几乎与别名以相同的方式工作,但更加程序化,并以标准方式接受输入。

我们不会在这里详细介绍,因为它们可以在许多复杂情况下使用,而且 bash 是一种完整的脚本语言,但我们将介绍一些基本示例。

首先,有两种声明 bash 语法的基本方法。第一种使用 function 命令,看起来像这样:

function function_name {command1command2
}

另一种语法使用一组括号,更像是 “C” 风格:

function_name () {command1command2
}

我们可以将第二种形式压缩成一行,并用分号分隔命令。最后一个命令后必须有一个分号:

function_name () { command1; command2; }

让我们首先演示一个非常有用的 bash 函数。这个函数将创建一个目录,然后立即进入该目录。这通常是我们创建新目录时所采取的确切顺序:

mcd () {mkdir -p $1cd $1
}

现在,当我们使用此函数而不是常规的 mkdir 命令时,将自动在创建后切换到该目录:

mcd test
pwd
/home/demouser/test

您会经常看到的一个很酷的函数是 extract 函数。它结合了许多实用程序,允许您解压几乎任何压缩文件格式。有许多变体,但以下来自这里:

function extract {if [ -z "$1" ]; then# 如果没有给出参数,则显示用法echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"echo "       extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"return 1elsefor n in $@doif [ -f "$n" ] ; thencase "${n%,}" in*.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar) tar xvf "$n"       ;;*.lzma)      unlzma ./"$n"      ;;*.bz2)       bunzip2 ./"$n"     ;;*.rar)       unrar x -ad ./"$n" ;;*.gz)        gunzip ./"$n"      ;;*.zip)       unzip ./"$n"       ;;*.z)         uncompress ./"$n"  ;;*.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)7z x ./"$n"        ;;*.xz)        unxz ./"$n"        ;;*.exe)       cabextract ./"$n"  ;;*)echo "extract: '$n' - unknown archive method"return 1;;esacelseecho "'$n' - file does not exist"return 1fidone
fi
}

此函数获取第一个参数,并根据所使用的文件扩展名调用适当的实用程序程序。

结论

希望本指南能够给您一些灵感,帮助您创建自己的别名和 bash 函数。广泛使用这些功能可以帮助您在 shell 中更加愉快、更少复杂地工作。

请记住要谨慎地重新定义具有潜在破坏性行为的现有命令。甚至将命令别名化为更安全的变体(例如,在递归删除之前始终要求确认)也可能在您依赖它的系统上第一次没有这个别名时给您带来麻烦。

要找到适合创建别名的候选命令,可以搜索您的历史记录以查找您最常用的命令。以下是一个一行命令,可以让我们看到我们最常用的命令:

history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/682531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Springboot】参数校验 spring-boot-starter-validation

# 第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>xxx</version> </dependency> # 第二步&#xff1a;实体类添加…

Excel

1、Excel的学习路径 2、掌握excel的基础要求 01、保证新版本 02、培养好的数据表格习惯 03、主动性探索 04、多联系 一、函数 二、文本清洗函数 三、常见文本的清洗函数 获取k的位置 FIND("k",P2,1) 从第1个位置开始在位置P2&#xff0c;查询字段k&#x…

Java+SpringBoot+Vue:高校科研管理的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

ChatGPT高效提问—prompt实践(智能开发)

ChatGPT高效提问—prompt实践&#xff08;智能开发&#xff09; ​ 如果你是一名程序员&#xff0c;一定有过这样的经历&#xff1a;排查某个bug话费好几个小时&#xff0c;在各个搜索引擎尝试搜索&#xff0c;浏览了几十甚至上百个网站&#xff0c;结果搜到的答案千篇一律&am…

websocket简易基操

一、概述 1.1 简介 WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;&#xff0c;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的&#xff0c;Websocket是一个持久化的协议。…

【STM32 CubeMX】GPIO的工作模式

文章目录 前言一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 总结 前言 在嵌入式系统开发中&#xff0c;对于STM32微控制器的GPIO&#xff08;General Purpose Input/Output&#xff09;引脚的配置和使用是至关重要的。GPIO引脚可以通…

基本算法--贪心

1.简述 贪心法的效率非常高&#xff0c;复杂度常常为O&#xff08;1&#xff09;&#xff0c;是一种局部最优的解题方法&#xff0c;而很多问题都需要求全局最优&#xff0c;&#xff0c;所以在使用贪心法之前需要评估是否能从局部最优推广到全局最优。 2.思路 作为算法的贪…

【解决】配置文件YAML: application.yml Cannot resolve configuration property ‘xxxx‘

配置文件YAML: application.yml Cannot resolve configuration property xxxx 问题排查解决 问题 在application.yml文件里面配置Bean的初始值&#xff0c;但是报错如下&#xff1a; Cannot resolve configuration property person.lastName 排查 我们先去Bean检查是否拼写…

【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲

通用定时器(GPTM)-输入捕获模式测量脉冲 文章目录 通用定时器(GPTM)-输入捕获模式测量脉冲1、通用定时器(GPTM)介绍2、输入捕获模式3、驱动API介绍4、定时器输入捕获示例CH32V307的通用定时器模块包含一个16 位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉…

C语言函数的实参与形参

概念&#xff1a; 函数调用中的参数&#xff0c;被称为实参&#xff0c;即 arguments函数定义中的参数&#xff0c;被称为形参&#xff0c;即 parameters 实参与形参的关系&#xff1a; 实参于形参的类型和个数必须一一对应。形参的值由实参初始化。形参与实参位于不同的内存区…

基于函数计算AIGC图片识别

目录 在 OSS 中建立图片目录 在函数计算中基于模板创建ImageAI应用 体验ImageAI图像识别效果 我们不但可以基于函数计算创建AIGC应用&#xff0c;实现以文生图&#xff0c;同时我们也可以基于函数计算创建ImageAI应用&#xff0c;通过简单几步实现对图片中对象的识别。下面我…

【运维测试】测试理论+工具总结笔记第1篇:测试理论的主要内容(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论测试理论测试工具相关知识。Python测试理论的主要内容&#xff0c;掌握软件测试的基本流程&#xff0c;知道软件测试的V和W模型的优缺点&#xff0c;掌握测试用例设计的要素&#xff0c;掌握等价类划分法、边界值法、因…

12.12 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | 比亚迪2024年实习生招聘&#xff01; 实习 | 比亚迪2024年实习生招聘&#xff01; 2、校招 | 上海飒智智能科技有限公司2024校园招聘 校招 | 上海飒智智能科技有限公司2024校园…

qt“五彩斑斓“ opengl

本篇文章我们来描述一下opengl相关知识 我们先看一下opengl渲染的效果 很漂亮&#xff1f; 那下面就来介绍一下这么漂亮的opengl OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的图形编程接口&#xff0c;用于渲染2D和3D图形。它提供了一系列函数和数据结…

Zotero插件分享(第二弹)

今天紧接上一篇文章&#xff08;Zotero常用插件分享&#xff09;&#xff0c;继续分享关于Zotero常用插件的相关内容。&#xff08;排名不分先后&#xff09; 1.Translate for Zotero 英文文献阅读辅助工具&#xff0c;可以实现将pdf中选中的文字翻译为指定语言&#xff0c;并…

Git中Idea操作git及Git Flow

目录 一、Idea中使用Git 1.idea配置Git和Gitee 2.实践操作 1.将本地项目推送到远程 2.从远程库克隆项目到本地 二、Git Flow 1.什么是Git Flow 2.工作流程 3.实践操作 一、Idea中使用Git 1.idea配置Git和Gitee 第一步&#xff1a;设置git.exe的安装路径 在设置中的…

知识碎片-mvn install时不需要mybatis-generator重新生成代码

背景 每一次项目编译的时候&#xff0c;Mybatis-Plus会重新生成代码&#xff0c;导致手动添加的Mapper和Data等注解失效 解决 在phase标签修改为deploy阶段或选择不覆盖已经存在的文件。 <plugin><groupId>org.mybatis.generator</groupId><artifactI…

RMSNorm原理及代码

RMSNorm原理及代码 在大模型中使用层归一化有如下几个因素&#xff1a; 改善网络稳定性加速收敛速度提高模型的泛化能力 批量归一化是对一个批次内的数据进行归一化 层归一化是对一个样本中的不同特征进行归一化 如下是LayerNorm与RMSNorm的公式 在LLaMA中使用RMSNorm替代…

DolphinScheduler安装与配置

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 DolphinScheduler的主要角色如下&#xff1a; MasterServer采用分布式无…

二分查找算法及其简单应用(C语言实现)

目录 二分查找算法介绍 二分查找算法的简单应用 二分查找算法介绍 二分查找算法&#xff0c;指在一组有序的数组内查找数值&#xff0c;查找的数值与查找范围内的中间数值进行比较&#xff0c;如果比中间数值小&#xff0c;则在原范围内的左侧范围内重复与该范围内的中间数值…