为什么我要创建一个别名来创建函数?

2024-03-17

我偶尔会看到这种模式,尤其是在有关 Bash 提示定制的问题上。

alias f='_ () { useful code; }; _'

我认为根本没有理由在这里创建别名。明显的重构

f () { useful code; }

它完全避免了声明别名,并且简单地一劳永逸地定义了函数,看起来更简单、更容易理解、更不脆弱、更高效。 (如果不明显,每次调用别名时别名都会重新声明该函数。)

例如,创建一个带有参数的 Bash 别名? https://stackoverflow.com/questions/7131670/make-a-bash-alias-that-takes-a-parameter有几个展示这种技术的答案。用于使用 ftp 路径运行 lftp 的 bash 脚本 https://stackoverflow.com/q/35771955/874188是一个关于函数内部实际功能的问题,其中有这样的代码,OP 没有解释为什么,即使我轻轻地催促。

这显然是一种反模式,还是有这样做的实际原因?在什么情况下这种设计才有意义?

This is not关于别名后面有一个空格,或者关于代码混淆(我发现的例子通常是完全可读的,除了这种神秘的技术)。


这是我对此的2美分,它代表了我个人的观点以及对该主题的理解。

  • 在函数中使用别名在某种程度上是开发人员的个人偏好。我将添加两种方法之间的一些差异,这也可能考虑到使用别名与函数的个人偏好
  • 有时,我想做的大多数事情都可以通过别名本身实现,但只有少数需要采用参数。因此,我没有将别名与函数混合使用,而是将别名与函数本身一起使用

Example:

alias kgps='kubectl get pods --all-namespaces | grep '

这非常有效,我可以搜索我的 kubernetes pod。现在,为了删除这些 pod,我需要在命令之间传递相同的参数,因此我使用内部带有函数的别名

alias kdp="_(){ kubectl get pods --all-namespaces  | grep \$1 | awk '{print \$2}' | xargs kubectl delete pod; }; _"

所以我的大部分快捷命令都可以通过aliases只有少数需要这样的东西我才使用带有函数的别名。

别名与函数

现在我想强调一下别名和函数之间的一些差异

与函数相比,别名可以更轻松地覆盖系统命令

如果我需要覆盖ls,我可以更轻松地做到这一点alias

alias ls='ls -altrh'

虽然等效的函数如下所示

ls() { command ls -altrh "$@";}
ls() { /bin/ls -altrh "$@";}

别名的目的主要是为了快捷方式

别名主要用于创建快捷命令,而函数则用于很多事情、复杂的命令组合、自动完成、bash 提示

别名更容易管理

Run alias命令您获取当前活动别名的列表

$ alias
....
vs='vagrant ssh'
vu='vagrant up'
vus='vu && vs'
....

要获取我们需要使用的函数列表declare -f或另一个类似的命令

$ declare -f | wc -l
  8226
$ alias | wc -l
  217

现在,如果我发布部分输出declare -f I get

$ declare -f
...
vi_mode_prompt_info () {
    return 1
}
virtualenv_prompt_info () {
    return 1
}
work_in_progress () {
    if $(git log -n 1 2>/dev/null | grep -q -c "\-\-wip\-\-")
    then
        echo "WIP!!"
    fi
}
zle-line-finish () {
    echoti rmkx
}
zle-line-init () {
    echoti smkx
}
zsh_stats () {
    fc -l 1 | 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 -n20
}

正如你所看到的,有很多功能被使用但与我无关。虽然alias命令给了我一个非常简洁的输出,我可以很容易地看到那里有什么。就我而言,100% 都是快捷命令

系统命令的转义别名和函数语法不同

要转义已定义的别名,您需要在其前面加上前缀\同时为functions你需要使用command <originalcommand>或命令的绝对路径/bin/originalcommand

别名的优先级高于函数

看下面的例子

alias ls='echo alias && ls'
$ ls() { /bin/ls -al }
alias
$ ls
alias
total 23173440
drwxrwxr-x+ 255 tarunlalwani  staff        8160 Jul 30 22:39 .
drwxr-xr-x+ 113 tarunlalwani  staff        3616 Jul 30 23:12 ..
...

正如你所看到的,当我们运行ls命令,首先使用别名,然后使用下一个ls正在调用该函数。

这也成为一种包装具有相同名称的现有函数并在内部重新使用原始函数的方法,这只能使用alias并推广问题中的格式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我要创建一个别名来创建函数? 的相关文章

  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 使用带有curl 的内部字段分隔符

    当我做 ls IFS l 我得到了我期望的输出 当我做 curl IFShttp www google com 我不 我是否误解了内部字段分隔符 如何在不使用任何空格字符的情况下运行curl 命令 您需要将变量放在大括号内 否则 shell
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 从 bash 从新的 Google Chrome 浏览器会话获取“用户代理”字符串

    我想要得到用户代理 HTTP 请求标头 https developer mozilla org en US docs Web HTTP Headers User Agent来自 bash 的新 Google Chrome 浏览器会话 刚刚打
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • 如何在 shell 脚本中操作 $PATH 元素?

    有没有一种惯用的方法从类似 PATH 的 shell 变量中删除元素 这就是我想要的 PATH home joe bin usr local bin usr bin bin path to app bin and remove or rep
  • bash 行长度限制从何而来?

    在运行 Bash 4 4 19 标准安装 的 Solaris 11 上 输入行似乎有 256 个字符的限制 我想了解这个限制从何而来 我浏览了手册页 但没有找到任何解决此问题的内容 仅当未使用 readline 库时才会发生这种情况 在下面
  • if [ -z "${FILE_LIST}" ] 中的 -z 是什么

    遇到了这个 什么是 z在 shell 脚本中if z FILE LIST 是相同的test And man test gives z STRING the length of STRING is zero 注意 在某些平台上 是一个符号链接
  • 迭代 bash 脚本中的变量名称

    我需要在一堆文件上运行一个脚本 这些文件的路径被分配给train1 train2 train20 我想 为什么不使用 bash 脚本使其自动执行呢 所以我做了类似的事情 train1 path to first file train2 pa
  • 匹配模式后添加行[重复]

    这个问题在这里已经有答案了 我有一个文件说test具有以下值 Linux Solaris Fedora Ubuntu AIX HPUX 如何在匹配 AIX 的行后面添加一行系统主机名 如果我做 echo hostname gt gt tes
  • 如何在 sh 的字符串中添加换行符?

    This STR Hello nWorld echo STR 产生作为输出 Hello nWorld 代替 Hello World 我应该怎么做才能在字符串中包含换行符 注意 这个问题不是关于echo 我知道echo e 但我正在寻找一种解
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 如何从 bash 数组中删除元素而不展平数组

    我想创建一个采用 bash 数组的函数 如下所示 a element zero element one element two 并删除一个元素 如 元素一 并留下一个数组 如下所示 a element zero element two 这样
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt

随机推荐

  • 从后台进程重定向 stdout 和 stderr

    我有一个名为 foo 的脚本 它运行程序 a exe 并将计时统计信息发送到文件 time log bin bash date 1 gt gt time log time a exe 2 gt gt time log 如果我在终端后台运行脚
  • 将现有 SVN 项目导入 Eclipse

    我在 C 盘上有一个文件夹 该文件夹已从 SVN 中签出 在该文件夹的某个位置 我有一个 Eclipse 项目文件夹 它已经在 SVN 存储库中 我启动了 Eclipse 导入了该项目 但我不知道如何将它连接到 SVN 当我正在做一个CVS
  • PDFBox - 如何创建目录

    有没有办法使用创建目录Java PDFBox图书馆 目录应该是可点击的 跳转到右侧页面 Thanks 没有简单的方法可以做到这一点 但这里有一个方法 我还没有弄清楚如何将链接直接附加到文本 所以我的方法意味着您必须将注释分别绘制为矩形和文本
  • blockui 优于 jQueryUI 模式对话框

    我无法让 BlockUI 在模式对话框上工作 我尝试解决 z index 问题 但没有成功 在我的网页中 这是标题
  • 如何在XtraReport中使用子报表?

    我有一份主要报告 其中包括 详细报告 Transaction Amount Due PaymentType Money Tendered 我还有另一份报告 其中包含订购的物品 物品报告 Transaction ItemName Quanti
  • Python“所有其他元素”习语[重复]

    这个问题在这里已经有答案了 我觉得我花了很多时间用 Python 编写代码 但没有足够的时间创建 Pythonic 代码 最近我遇到了一个有趣的小问题 我认为可能有一个简单 惯用的解决方案 解释一下原文 我需要收集列表中的每个连续对 例如
  • 正在分析的二进制文件必须是可执行文件

    我正在尝试上传一个应用程序供 Apple 审核 但不确定我做错了什么而收到此错误消息 二进制文件必须是可执行文件 zip 文件名看起来应有的样子 项目名称中没有可见的空格 路径末尾的名称除外 示例 ProjectName app zip P
  • 为什么单例类很难测试?

    有效的Java第 3 条 使用私有构造函数或枚举类型强制执行单例属性 指出 将类设置为单例可能会使测试其客户端变得困难 因为不可能用模拟实现替代单例 除非它实现了充当其类型的接口 出于测试目的 为什么实例化一个单例实例并测试其 API 还不
  • 在 chrome 开发工具中隐藏 401 console.error 在 fetch() 调用时获取 401 [重复]

    这个问题在这里已经有答案了 我有一些代码可以进行提取调用 这利用了现代 chrome firefox 中内置的 window fetch api 该代码有时会出现 401 未经授权的响应 这是正常的 我希望忽略它 我可以通过代码流来做到这一
  • 从 Dock 中删除 AppleScript 脚本的图标

    如何隐藏正在运行的 AppleScript 的停靠栏图标 并仅将应用程序保留在菜单栏中 要隐藏应用程序使其不显示在 Dock 中 您需要修改应用程序内的 Info plist 文件 最简单的方法是在 Finder 窗口中选择应用程序 按住
  • numpy 中两个二维掩码数组的快速内积

    我的问题如下 我有两个数组X and Y形状为 n p 其中p gt gt n 例如 n 50 p 10000 我也有口罩mask 大小为布尔值的一维数组p 关于p of small密度 例如np mean mask 为 0 05 我尝试尽
  • 如何删除 XQuery 中的重复节点?

    我有一个动态生成的 XML 文档 我需要一个函数来消除其中的任何重复节点 我的函数如下所示 declare function local start2 let data local scan books return
  • 修改向量的元素(按值、按引用)函数 C++

    我有一个必须修改向量值的函数 在 C 中返回向量是一个好的做法吗 功能一 vector
  • 如何使用 MediaRecorder 作为 MediaSource

    作为学习 WebRTC 的练习 我试图并排显示本地网络摄像头和网络摄像头的延迟播放 为了实现这一目标 我尝试将记录的 blob 传递到 BufferSource 并使用相应的 MediaSource 作为视频元素的源 the ondataa
  • Google oAuth2 令牌越来越多地失效

    我有一个基于 oAuth2 构建的 Web 应用程序 该应用程序已经投入生产 5 年多了 用户通过 Google 进行身份验证和授权 并授予我的应用程序对 Google Analytics 数据的访问权限 突然间 我发现刷新用户 oAuth
  • 如何为多个变量声明具有多个限制的 sympy Piecewise

    同情 我如何声明Piecewise子函数中多个变量具有多个限制的函数 这是我的背景和尝试 from sympy import Piecewise Symbol exp from sympy abc import z x1 Symbol x1
  • 绕过 CloudFlare 的 100 秒超时

    我正在尝试 AJAX 化我的报告 以绕过 CloudFlare 对通过其站点运行的请求强加的 100 秒超时 See 是否可以增加 CloudFlare 超时 https stackoverflow com questions 385361
  • 正则表达式提取可选组

    我有一些格式为的日志字符串 T01 Warning Tag1 Message T23 Tag2 Message2 我正在尝试提取T数 检测是否存在Warning 然后将标签和消息的文本全部放在一个正则表达式中 不过 警告 的可选要求让我感到
  • 如何在cakephp中生成'a href="javascript:void(0)"'之类的链接?

    如何在 CakePHP 中生成类似 a href javascript void 0 的链接 我制作了一个应用程序 当用户单击图像列表时 内容将插入到编辑器文本区域中 我向这些图像添加一个类 并在 javascript 文件中编写一些代码
  • 为什么我要创建一个别名来创建函数?

    我偶尔会看到这种模式 尤其是在有关 Bash 提示定制的问题上 alias f useful code 我认为根本没有理由在这里创建别名 明显的重构 f useful code 它完全避免了声明别名 并且简单地一劳永逸地定义了函数 看起来更