我想在我的中创建一个别名~/.bash_profile
:
- 采取两个论点
$1 $2
- 将这些传递给
diff
- 将输出通过管道传输到
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 个别名将按预期工作。有人可以分享以下方面的知识吗:
- 为什么会出现EOF错误?
- 如何使用 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 的链接,这是一个很棒的资源!