0

这个用于将多行字符串文字分配给变量的典型 Bash 脚本习惯用法:

read -r -d '' FILE_CONTENTS <<'EOF'
... contents ...
EOF

在我使用它的任何地方都很好地为我服务。

root我像今天一样运行一个包含这个成语的脚本,结果一败涂地。文件会损坏,各种奇怪的东西从天而降。我蒸发了我的 Mac。顺便说一句,这个错误已经摧毁了......基本上一切。如果我可以投票支持自己拥有核能力,我会的。自我毁灭的有效性。


核
(来源:iliketowastemytime.com


让我为您提供一个最小的工作配置来复制它:

# Recreating a .vimrc file, for example
read -r -d '' FILE_CONTENTS <<'EOF'
    let mapleader = "<space>"
    let maplocalleader = "\\"
EOF
echo "${FILE_CONTENTS}" > .vimrc

这作为用户工作得很好,tinosino但是......作为根......任何带有反斜杠的东西都是有问题的。

为什么?在哪里寻找“差异”?选项?环境?“回声”的别名(?!)我迷路了。也尝试bash -x过:我正在测试的脚本上的页面和页面失败。在 root 的设置中可能会改变什么?在哪里?

OS X version: 10.8.2
Bash version: 3.2.48(1)-release

我在剧本中有一个shVsbash守卫,但没有奏效……它是不是结构不好?

if [ ${BASH_VERSION-not_running_within_bash} = not_running_within_bash ]; then
  echo This script is meant to be executed by the Bash shell but it isn\'t.
  echo Continuing from another shell may lead to unpredictable results.
  echo Execution will be aborted... now.
  return
fi

它停止zsh但不会停止sh运行脚本......我怎么能这样做?

编辑:我求助于将脚本保护更改为:

if [[ ! $(ps -p $$ -o comm | paste -s - | awk '{ print $NF }') == *bash* ]]; then
4

2 回答 2

2

不要忘记 root 通常以 #!/bin/sh 的形式运行脚本

#!/bin/bash您描述的错误听起来像是为运行而编写的脚本#!/bin/sh。在某些系统上#!/bin/sh指向#!/bin/bash,因此您的 bash-ismed 代码可以工作,但是当使用真正的 Bourne Shell ( #!/bin/sh) 运行时,bashisms 会导致脚本失败,有时,就像您的情况一样,以非常灾难性的方式失败。

只是注意到您对 BASH_VERSION 的测试。好主意。我敢打赌,由于=. 试试吧-eq。我没有真正的 Bourne Shell 可供测试。

对不起,祝你好运。

于 2012-10-09T19:58:05.080 回答
0

这将是另一种方法:

#!/bin/bash
(
cat <<'EOF'
let mapleader = "<space>"
let maplocalleader = "\\"
EOF
) > .vimrc
于 2012-10-09T19:17:33.910 回答