首页 > 解决方案 > 尝试在 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直接运行命令时,调用该函数只会转换第一个文件而不是所有文件。

提前感谢任何帮助我了解这里出了什么问题的帮助。:)

标签: bashaliassoffice

解决方案


因为你的函数只接受两个参数。

可能不会硬编码路径soffice;相反,请确保您PATH包含安装它的目录。

无论如何,别名在这里完全没用;另请参阅为什么我要创建一个创建函数的别名?

如果您想创建一个函数,请尝试类似

libreconv () { soffice --headless --convert-to "$@"; }

论点"$1""$2"从字面上扩展到前两个论点。该参数"$@"扩展到所有参数,保留引号(如果您想处理其中包含空格的文件名等,这很重要;您会看到许多脚本错误地使用"$*"$@没有引号)。

切线地,如果它位于soffice您不想要的奇怪位置,请在您的. 一种常见的安排是拥有并使用指向奇怪二进制文件的符号链接填充它,可能包括您自己的脚本,这些脚本安装在某个地方的 Git 工作目录中进行开发。PATHPATH~/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创建指向真实位置的符号链接。


推荐阅读