仅当将 Shell 脚本的内容复制到新的 Shell 脚本文件时,才会运行

仅当将 Shell 脚本的内容复制到新的 Shell 脚本文件时,才会运行

我有一个由 java jar 生成的 shell 脚本,在创建该脚本时我无法运行任何与 postgres 相关的内容。但是,当将其所有内容复制到新的 shell 脚本文件中时,我能够完美地运行该脚本。脚本的内容基本上只是连接到我的 postgres 数据库,创建一个新数据库并填充它。以下是一段代码:

#!/bin/bash

export DATABASE_NAME="dbname"
export DB_USERNAME="postgres"
psql -c "drop database $DATABASE_NAME;" postgres postgres
psql -c "create database $DATABASE_NAME;" postgres postgres

echo "Starting scripts"
psql -f db/pgsql/schema/schema.sql $DATABASE_NAME $DB_USERNAME

对于为什么会出现这种情况您有什么想法吗?

编辑:为澄清起见,当脚本到达此行时会出现错误:

psql -c “删除数据库 $DATABASE_NAME;” postgres postgres

此文件中需要执行的每一行都出现以下错误:

psql:fe_sendauth:未提供密码

我已经确认的事情:

  • Shell 脚本是可执行的

  • ~/.pgpass 具有必要的凭证

  • 如果将该脚本的内容复制到新文件并运行该文件,则一切都将按预期运行。

答案1

我会使用diffcat -v filename来查看工作脚本和非工作脚本之间的区别。假设第二个“postgres”是密码,则可能存在一些不可见的东西阻止它被识别 - 例如在 *Nix 机器上使用 Windows control-M (CR) 行结尾。

答案2

确保创建的 shell 脚本文件具有执行在运行之前设置位。

答案3

信息来自postgres 维基psql --help建议您将用户名放在 .pgpass 文件中,并在脚本中运行以下命令:

export PGPASSFILE=$HOME/.pgpass
psql -w -f db/pgsql/schema/schema.sql $DATABASE_NAME 

附言:您是通过获取源来运行新复制的文件还是以二进制文件的形式运行它?即:

. newfile 

或者

./newfile

相关内容