【发布时间】:2016-01-06 08:51:19
【问题描述】:
我要运行一个命令来生成随机字符串:
var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8`
当我在交互式 bash 会话中运行此命令时,我绝对不会出错。但是当我将此命令放入脚本并将其作为脚本运行时,我得到了 tr 指示的 Broken pipe 错误。我已经阅读了几个相关主题,但仍然没有答案为什么脚本和交互行为不同,有没有办法通过 shell 选项或其他东西来控制它?
编辑我:
关于给定的 cmets,我发现指示损坏的管道错误可以通过以下方式控制:
trap - SIGPIPE # to ignore errors
和
trap "" SIGPIPE # to display errors
编辑二:
好吧,我提供的有关繁殖条件的信息不正确。最后,似乎是使用 os.system() 调用脚本的 python 包装器引起的问题:
python -c "import os; os.system('sh -c \"< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8\"')"
给定的行会产生与使用的操作系统无关的损坏管道错误。
编辑 III:
这里已经讨论过这个话题: https://mail.python.org/pipermail/python-dev/2005-September/056341.html
【问题讨论】:
-
听起来像是here 和参考问题中正在讨论的问题。 (这里不涉及shellcheck,它恰好是对这个确切问题的讨论和关于拥有shellcheck的讨论,这是一个很棒的工具,警告这种事情。)
-
在 Cygwin/bash-4.1.10(4) 下完美运行...(在脚本中设置你的行加上
echo $var,除了#!/bin/sh。) -
你是否在脚本中捕获了 SIGPIPE?
-
trap - pipe== 将 sigpipe 重置为其默认配置(=kill 目标);trap '' pipe== 设置 sigpipe 的配置为SIG_IGN -
tr -dc _A-Z-a-z-0-9显然应该是tr -dc _A-Za-z0-9。我得到“无效的字节序列”,除非我在 repro 命令行前加上LC_ALL=C(来自urandom的字节通常不是有效的 UTF-8,它会触发tr和通常在 UTF-8 语言环境中的大多数字符处理实用程序)。
标签: python bash shell pipe head