使用管道接受参数的别名命令

使用管道接受参数的别名命令

我想在我的中创建一个别名~/.bash_profile

  1. 采取两个论点$1 $2
  2. 将这些传递给diff
  3. 将输出通过管道传输到less

我在 Stack 上没有找到任何可以满足我需要的解决方案,但请向我指出您知道的任何解决方案!以下几行出现在 my 中~/.bash_profile

alias reload='. ~/.bash_profile'
alias aliases='emacs ~/.bash_profile; reload'
function dif () { diff "$1" "$2" | less; }
alias different='dif' 

当我尝试时:

gsuehr$ reload
-bash: /Users/gregorysuehr/.bash_profile: line 93: syntax error: unexpected end of file 

我确信我不明白如何使用 bash 函数。我已经确认,reload aliases如果我注释掉函数声明,这 2 个别名将按预期工作。有人可以分享以下方面的知识吗:

  1. 为什么会出现EOF错误?
  2. 如何使用 bash 中的函数来完成我在这里尝试的事情?

答案1

您不能使用别名在参数后添加内容,您需要一个函数。使用别名仅用于为命令提供备用名称 ( alias myalias=mycommand) 或提供初始参数 ( alias myalias='foo --option1 --option2')。

在 bash 中,您可以使用function myfunction { … }myfunction () { … }或中的任何一个function myfunction () { … }来定义函数。该形式的myfunction () …优点是可以移植到所有 sh shell。带有关键字的表单具有即使是别名function也可以工作的优点(在这种情况下您可以使用它来使标准表单工作)。除了别名之外,这些语法在 bash 中是完全相同的。myfunction\myfunction () …

函数名称或 后面的内容()必须是格式正确的复杂命令。根据你的判断回答(您问题中的代码不会产生错误消息,显然您没有发布您测试的版本),您的错误是您编写的复杂命令不正确。仅当大括号{和是命令中的第一个内容时,它们}才被识别为开始列表和结束列表语法,因此在右大括号之前需要换行符或分号。

此外,您应该传递所有参数,而不是传递两个参数diff并忽略其他参数。就是这样"$@"是为了.

function dif () { diff "$1" "$2" | less; }

此外,交互式 bash 会话的自定义应该进入.bashrc,而不是.bash_profile.bash_profile仅由登录 shell 读取,当您打开 bash 的新实例(例如在终端中)时不会读取它。由于 bash 中的设计缺陷,.bashrc即使登录 shell 是交互式的,也不会读取它们,因此您应该将此行放在您的.bash_profile

if [[ $- == *i* ]]; then . ~/.bashrc; fi

并将交互式自定义(例如别名、函数(如dif、键绑定、提示等))放入~/.bashrc.

答案2

将此作为答案发布,而不是更新我的问题,请告诉我是否应该这样做!

在这种情况下,我的 .bash_profile 无法重新加载,因为我误解了 bash 函数语法。

    function dif () { diff $1 $2 | less }

应该只是:

    dif () { diff $1 $2 | less; }

编辑:在 后添加分号less。我已经验证它有效!

感谢@John1024 提供了 shellcheck.net 的链接,这是一个很棒的资源!

相关内容