Bash shell别名未按预期工作

jay*_*jay 0 bash shell

我正在尝试编写一个shell脚本,它使用LibreOffice将.odt文件转换为.pdf,但却陷入了别名问题.我的内容如下~/.bash_profile:

alias soffice='/Applications/LibreOffice.app/Contents/MacOS/soffice'
Run Code Online (Sandbox Code Playgroud)

我的shell脚本中有以下行:

soffice --headless --convert-to pdf $filename
Run Code Online (Sandbox Code Playgroud)

这会产生"第14行:soffice:command not found"错误.我不知道发生了什么事,因为我可以打电话

$ alias
alias soffice='/Applications/LibreOffice.app/Contents/MacOS/soffice'
Run Code Online (Sandbox Code Playgroud)

$ soffice --headless --convert-to pdf thefile.odt
Run Code Online (Sandbox Code Playgroud)

也行得很好.有谁知道为什么别名在我的脚本中不起作用以及我能做些什么呢?谢谢.

Joh*_*024 5

默认情况下,bash别名仅在交互式shell中扩展,而不是在脚本中扩展.

通常,这是一件好事,因为大多数脚本都是在假设它们使用的是真正的命令而不是别名的脚本时编写的.例如,很多人别名rmrm -imvmv -i.对于交互式工作,这很好:它会让你知道你输错了什么,并试图删除错误的文件.对于可能正在移动许多文件的shell脚本,它很快就会变得尴尬.此外,如果shell脚本重定向了stdin,则会发生意外情况.

因此,最好避免在shell脚本中使用别名.

如果确实需要soffice脚本可用的快捷方式而不启用别名,请创建一个soffice使用内容调用的文件:

#!/bin/sh
exec /Applications/LibreOffice.app/Contents/MacOS/soffice "$@"
Run Code Online (Sandbox Code Playgroud)

根据需要添加自定义选项,使其可执行,并将其放在路径上的某个位置.

如果您知道自己不想要任何自定义选项或自定义目录,则可以选择创建符号链接:

ln -s /Applications/LibreOffice.app/Contents/MacOS/soffice /somewhere/on/your/path/soffice
Run Code Online (Sandbox Code Playgroud)

许多人添加$HOME/bin到他们的路径并将所有这些符号链接和shell脚本放在那里.

更多方法: 这个问题有很多答案:

有关基于PATH的解决方案的更多信息,请参阅@Palec@Bryn的答案.

有关如何使用与别名不同的函数,请参阅@glenn jackman的答案.

如果您仍想使用别名,请参阅@ mklement0@ user202988的答案