Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本有时会出现“错误”;跳过;语句的前两个字符。如何排除故障?_Bash - Fatal编程技术网

bash脚本有时会出现“错误”;跳过;语句的前两个字符。如何排除故障?

bash脚本有时会出现“错误”;跳过;语句的前两个字符。如何排除故障?,bash,Bash,我编写了一个bash脚本,它运行从远程暂存数据库到本地机器(我的Macbook)上的开发数据库的部分同步。脚本首先将某些表从临时数据库(通常通过SSH隧道)转储到本地.sql文件,然后针对本地数据库执行这些.sql文件。以下是脚本(一些表重命名以保护罪犯): 我首先打开一个ssh隧道,允许我访问远程(源)db,然后使用DATABASE\uURLenv-var集运行该脚本。正如您所看到的,我调用脚本的方式没有什么特别之处: # In one window, open an SSH tunnel s

我编写了一个bash脚本,它运行从远程暂存数据库到本地机器(我的Macbook)上的开发数据库的部分同步。脚本首先将某些表从临时数据库(通常通过SSH隧道)转储到本地.sql文件,然后针对本地数据库执行这些.sql文件。以下是脚本(一些表重命名以保护罪犯):

我首先打开一个ssh隧道,允许我访问远程(源)db,然后使用
DATABASE\uURL
env-var集运行该脚本。正如您所看到的,我调用脚本的方式没有什么特别之处:

# In one window, open an SSH tunnel so I can access the source db
ssh -NTL 55555:cello-staging.rds.amazonaws.com:5432 ubuntu@staging.cello.com

# In second window, run the script with DATABASE_URL set
DATABASE_URL=postgres://un:pw@localhost:55555/cello_staging sh bin/importdb.sh
其中一些表很大(4m+行),因此整个脚本可能需要几个小时才能完成。(是的,我确信有更好的方法为开发人员数据库种子。)

我的问题是::脚本经常(约60%的时间)失败,并出现错误,提示语句的某部分被“跳过”。一个例子:

# The failure message:
-bash: mp_table: command not found

# The statement at that line in the script:
dump_table admissions
另一个例子:

# The failure message:
bin/importdb.sh: line 65: port/admissions.sql: No such file or directory

# The statement at that line in the script:
psql -d cello_development -f export/admissions.sql
失败与我在该行运行语句时看到的一致,没有前两个字符(总是正好两个前导字符)。例如,如果我独立运行语句
dump\u table
(假设定义了
dump\u table
函数),我希望它会成功;但是如果我独立运行语句
mp_table admissions
,我会看到与上面相同的失败消息

故障往往发生在两个特别大的表操作之后。但并非所有比较大的表都受到了比较大的影响

我最好的猜测是,不知何故,正在运行的昂贵的postgres DB操作导致bash脚本变得混乱,有时会在后续语句中“跳过”字符

我的问题:

  • 您将如何对此进行故障排除?当bash脚本中的语句在执行之前(有时)被更改/缩短时
  • 在执行bash脚本时,早期语句的副作用是否可能以某种方式影响脚本中后续语句的措辞
  • 我正在运行的
    psql
    &
    pg_dump
    命令是否可能与调用它们的脚本的内容交互
背景:我使用的是MacOS 10.14,使用的是iTerm2。本地数据库服务器是Postgres v9.6

编辑1:脚本本身在任何时候都不会被修改。它已签入Git,未显示任何更改,它位于我的本地计算机上,除我之外,任何用户都无权对文件进行更改


编辑2:重写以包含正在运行的完整脚本以及我用来调用它的完整命令。

我不明白是什么导致了这种情况,但有一些建议可以解决/避免它

  • 在我看来,好像有什么东西在从shell中窃取输入。在出现问题之前,请尝试重定向命令的输入:

    pg_dump $DATABASE_URL -s > export/_structure.sql </dev/null
    
    dump_table events </dev/null
    dump_table users </dev/null
    ...etc
    

顺便说一句,我建议在脚本的开头使用适当的shebang行,使其可执行(
chmod+xbin/importdb.sh
),然后不使用
sh
命令直接运行。本质上,脚本的作者(通过脚本本身)应该定义脚本所用的语言/方言等,而不是运行脚本的人(/outer script/cron entry/whatever)。

在正常运行和失败运行之间有什么变化吗?是否有人在脚本运行时修改脚本?脚本文件是否有可能在运行时被修改?或者是脚本本身修改,或者是其他人正在修改?您是否在问题发生前后检查了脚本文件的修改时间?您实际上是如何运行脚本的?看起来在shell执行脚本读取脚本的同时,有其他东西正在读取脚本。@chepner ITYM“有其他东西在同时编写脚本”。@Jens我已经看到了通过stdin传递脚本时的窃取输入效果,主要是在ssh连接上运行时,如
sshuser@server对非常感谢。

pg_dump $DATABASE_URL -s > export/_structure.sql </dev/null

dump_table events </dev/null
dump_table users </dev/null
...etc
#!/bin/bash
if true; then    # Workaround to avoid script reading weirdness
    rm -rf export/
    mkdir export

    ...

    exit
fi