bash - 尝试在 Bash shell 中运行函数会产生意想不到的结果
问题描述
我一直在尝试使用命令行中的 libreoffice 将一堆非常旧的 MS Office 文件批量转换为 odf 格式以用于存档目的。为此,我首先将所有文件收集在一个目录中,然后在所述目录中调用以下命令(用于 doc 文件):
/path/to/soffice --headless --convert-to odt *doc
这很好用,该命令会导致目录中的所有 doc 文件一次性转换。但是,我想避免总是soffice
用必要的参数输入路径,所以我在我的 Bash 配置文件中添加了以下内容:
alias libreconv='function _libreconv(){ /path/to/soffice --headless --convert-to "$1" "$2"; }; _libreconv'
但是,当我现在尝试调用以下内容时:
libreconv odt *doc
这导致只有目录中的第一个 doc 文件被转换,之后函数退出并返回我提示......也许我错过了一些明显的东西(毕竟我是一个 cli newb),但我不明白为什么当我soffice
直接运行命令时,调用该函数只会转换第一个文件而不是所有文件。
提前感谢任何帮助我了解这里出了什么问题的帮助。:)
解决方案
因为你的函数只接受两个参数。
可能不会硬编码路径soffice
;相反,请确保您PATH
包含安装它的目录。
无论如何,别名在这里完全没用;另请参阅为什么我要创建一个创建函数的别名?
如果您想创建一个函数,请尝试类似
libreconv () { soffice --headless --convert-to "$@"; }
论点"$1"
并"$2"
从字面上扩展到前两个论点。该参数"$@"
扩展到所有参数,保留引号(如果您想处理其中包含空格的文件名等,这很重要;您会看到许多脚本错误地使用"$*"
或$@
没有引号)。
切线地,如果它位于soffice
您不想要的奇怪位置,请在您的. 一种常见的安排是拥有并使用指向奇怪二进制文件的符号链接填充它,可能包括您自己的脚本,这些脚本安装在某个地方的 Git 工作目录中进行开发。PATH
PATH
~/bin
你.bash_profile
或类似的一个常见的咒语是
if [[ -d ~/bin ]]; then
case :$PATH: in
*:~/bin:* | *:$HOME/bin:* ) ;;
*) PATH=~/bin:$PATH;;
esac
fi
有了它,您可以(~/bin
如果它不存在则创建;mkdir ~/bin
)并ln -s /path/to/soffice ~/bin
创建指向真实位置的符号链接。
推荐阅读
- gcc - 如何使用 CMake 在 AIX 上生成 *.so 文件
- angular - 无法绑定到“ngForOf”,因为它不是“li”的已知属性
- javascript - 使用 Javascript 将 H1 标签更改为 H2
- google-kubernetes-engine - 是否可以通过 L4 LB 与 GKE 直接连接 grpc 客户端而不使用 ESP?
- r - R中的ggplot - 带有颜色分割图块的geom_tile
- firebase - 如何在 React Native Firebase 中检查好友的存在
- java - NoSuchMethodError SpelParserConfiguration
- rust - 如何摆脱“无法返回引用临时值的值”错误
- bash - 计算每个子目录中同一报告文件的警告数
- c# - 为什么这个类型从引用类型变成了值类型