命令在 bash 脚本中不可用

命令在 bash 脚本中不可用

我的公司有一个在 Linux 中安装的自定义工具,用于将文件上传到名为oTools.当我打开新终端时,我可以(从任何文件夹)运行oTools upload file文件已上传至服务器。

但是,该工具没有一次上传多个文件的选项。所以我正在尝试构建一个 bash 脚本来做到这一点。这是我构建的代码

#!/bin/sh

for file in ./folder/*
do
  oTools upload $file
done

但我有以下错误:

./upload-all.sh: oTools: 未找到

我检查了我的文件.bashrc,它包含 oTools 的路径:

alias oTools="/home/user/folder/oTools-cli"

我还尝试将完整路径放在我的脚本中(上面的路径,即.bashrc文件中的路径),但我遇到了同样的问题。我尝试使用ls而不是我安装的工具执行相同的代码,并且它有效......

那么,如何制作 bash 脚本来识别我的自定义工具呢?

答案1

你至少面临两个问题:

  • 当 shell 非交互式时,别名不会扩展,除非expand_aliases使用 来设置 shell 选项shopt

  • .bashrc通常保存交互式 shell 的配置,而不是脚本(也称为非交互式 shell)的配置。

有一些解决方案:

# Set expand_aliases option and add the alias (in your script)
shopt -s expand_aliases
alias oTools="/home/user/folder/oTools-cli"

# Create a function instead of an alias (in your script)
oTools() { /home/user/folder/oTools-cli "$@"; }

# Add /home/user/folder to your PATH (in your .profile)
PATH="/home/user/folder:$PATH"

答案2

当您编写脚本时,它通常不会引入您的别名。

您可以考虑在脚本中显式指定命令:

#!/bin/sh
oTools="/home/user/folder/oTools-cli"
for file in ./folder/*
do
    ${oTools} upload "${file}"
done

答案3

这是我通过 cron 运行脚本时遇到的问题。我不确定它是否适用于这里,但这里尝试在脚本的开头添加您的路径。就像是...

    #!/bin/bash

    PATH="/your/path"
    ...

相关内容