当前位置: 首页 > 知识库问答 >
问题:

为什么我的脚本在收到命令后突然退出?[副本]

鲁熙云
2023-03-14

我正试图按照以下说明为Dash生成文档集:http://kapeli.com/docsets.问题是,脚本在wget之后不会继续,并且似乎不会抛出任何错误。当我把脚本复制到终端时,一切都很好。

我使用的是MacOS 10.8.4和默认的bash。

#!/usr/bin/env bash
set -e

mkdir -p $1.docset/Contents/Resources/Documents/

echo "THIS RUNS"
wget -rkp -l3 -np -nH --cut-dirs=1 --directory-prefix="./"$1".docset/Contents/Resources/Documents/" $2
echo "THIS DOES NOT RUN"

sed "s/NAME/$1/g" template > $1.docset/Contents/Info.plist
touch $1.docset/Contents/Resources/docSet.dsidx
# (script continues) 

我查看了其他帖子,比如我的shell脚本在exec之后停止,但我没有在这里使用exec。

为什么脚本退出?

共有3个答案

颜森
2023-03-14

尝试使用here文档,例如:

cat > "$1.docset/Contents/Info.plist" << EOF
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
    <key>CFBundleIdentifier</key>
    <string>$1</string>
    <key>CFBundleName</key>
    <string>$1</string>
    <key>DocSetPlatformFamily</key>
    <string>$1</string>
    <key>isDashDocset</key>
    <true/>
  </dict>
  </plist>
EOF

它不太容易出现引用错误

常枫涟
2023-03-14

更新

我最初的回答是对你的问题的误解。一个似乎是问题的问题是你的:

INSERT INTO searchIndex (name, type, path) VALUES (index, Guide, 'index.html');

这里不确定。但似乎您可能想要创建indexGuide字符串,如下所示:

INSERT INTO searchIndex (name, type, path) VALUES ('index', 'Guide', 'index.html');
海信鸥
2023-03-14

您启用了set-eakaerrexit

如果其中一个命令返回非零退出代码,则脚本将退出,并且可能并不总是很明显哪个命令失败:

  • 有些人可能会打印出一个有用的错误来识别自己和问题
  • 一些(如wget)可能会在一页又一页的输出中简要提及错误
  • 有些(如grep)可能根本不显示错误或任何输出,脚本只是退出

要知道哪个命令导致了问题,请使用-xakaxtraces运行脚本:

bash -x script.sh

或者将set-x添加到脚本本身:

set -x
set -e
...

这将导致脚本打印出正在执行的每个命令,以便您可以看到哪一个是最后一个。

如果要忽略命令的退出状态,可以添加true:

# Causes exit if you lack read permission on any directory
find . -name '*.sh' 

# Does not cause the script to exit
find . -name '*.sh' || true

如果希望在脚本中触发set-e时收到警报,可以设置陷阱:

#!/bin/bash
set -e
# Show error if commands exit with non-zero
trap 'ret=$?; echo "$0:$LINENO: Error: set -e triggered"; exit $ret' ERR
# Would have failed silently
grep doesnotexist /etc/passwd
echo "This does not run"

执行时:

$ ./foo
./foo:6: Error: set -e triggered
 类似资料:
  • 为什么我的 Docker 在执行我的 shell 脚本后退出?谢谢。 Docker版本: 我的图片: 运行后: 我检查了:< code>docker ps -a 以下是run.sh: 我得到了日志: 之后,我的码头集装箱出口: 但是,当我使用时: 我的容器工作得很好。为什么?

  • 这里似乎有很多很多线程,谷歌点击了退出、退出和操作系统的重复使用_exit(),sys。Python中的exit(),但我发现没有一个可以很好地与IPython配合使用。 当我使用它们中的大多数时,我会得到: 我试图在Python中调试-当满足特定条件时,我希望Python停止执行并返回到Python命令行,以便我可以检查全局变量等。 怎么做? 现在我已经这样做了,当我点击Ctrl-C时,它就可以

  • 我最近在Windows 10机器上下载了截至2020年3月的python(3.8),并检查了我的Pip版本。我使用了pip(版本)和其他几个命令,但它说“pip不能被识别为内部或外部命令、可操作的程序或批处理文件。”我去了Windows中的简单搜索栏,找到了安装在我电脑上的pip。那么我需要使用什么命令来使用pip呢?还是我还遗漏了什么?

  • 下面是我的代码: 和控制台输出以下内容: 我以为使用toString可以去掉[],为什么它还在那里? 编辑:如果toString不是摆脱[]的正确方法,那么正确的方法是什么?

  • 我已经编写了一个程序,它监视一个目录,并在用户添加文件时发出警报,该文件的特定格式为用户名。文件它工作正常,但当我在收到新文件被添加的警报时按ok,程序退出,我希望它保持运行。 下面我写的代码将作为该应用程序中另一个PYQT应用程序的子进程运行。因此,我不会执行main(),而只是实例化SendMyFiles对象。

  • 在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行。 我想把我所有的后台进程PID写到一个pidfile中。然后在最后pgrep PID file,看看在我退出之前是否还有进程在运行。 有什么更简单的方法吗?而TCL有没有具体的办法做到这一点呢?