![sh 别名:未找到命令](https://linux22.com/image/1295206/sh%20%E5%88%AB%E5%90%8D%EF%BC%9A%E6%9C%AA%E6%89%BE%E5%88%B0%E5%91%BD%E4%BB%A4.png)
我写了一个非常简单的脚本,如下所示:
function apply_to_dev {
echo "Applying scripts to DEV..."
alias ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"
shopt -s nullglob
for f in ~/src/trunk/Database/scripts/upgrades/current/*.sh
do
echo $f
. $f
done
for f in ~/src/trunk/Database/scripts/upgrades/current/*.sql
do
echo $f
FOUT=`basename "$f"`
ISQL -i "$f" -o "$LOGDIR/$FOUT.dev.out"
done
}
apply_to_dev
当我运行它时我收到这些错误消息
~/src/trunk/Database/scripts/upgrades/current/JIRA-0192.sql
~/bin/RunSQL.sh: line 48: ISQL: command not found
为什么 sh/bash 会认为 ISQL 是命令而不是别名。如果我在“alias ISQL=...”后面添加“alias”,我可以在别名打印输出中看到 ISQL。
疯狂的是,第一个 for 循环中的 *sh 文件实际上也调用了 ISQL。ISQL 在 *.sh 文件中可见。
答案1
如果必须使用别名?那么它可能应该在脚本之外(全局)。
无论如何,这都不是必要的,而且实际上很浪费。只需删除该词,它就会按预期工作。
顺便说一句,如果您稍后需要它,但在同一运行中,您可以将其作为变量导出......(然后子 shell 将能够“看到”它。)
导出 ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"
或者也许更整齐
ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"
导出 ISQL
但不确定这是否是你的意图。
如果你只希望它是函数的本地函数,那么在 bash 中你必须这样说:
本地 ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"
$ 帮助本地
local: local [option] name[=value] ...
Define local variables.
Create a local variable called NAME, and give it VALUE. OPTION can
be any option accepted by `declare'.
Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.