Bash read-r-d'';文件内容<<';EOF';当根在我身上的时候

Bash read-r-d'';文件内容<<';EOF';当根在我身上的时候,bash,Bash,将多行字符串文字分配给变量的典型Bash脚本习惯用法如下: read -r -d '' FILE_CONTENTS <<'EOF' ... contents ... EOF 这就像用户tinosino一样工作正常,但是。。。作为根。。。任何带有反斜杠的东西都有问题 为什么??从哪里寻找“差异”?选择?环境“echo”(?!)上的别名我迷路了。也尝试了bash-x:我正在测试的脚本上出现了一页又一页的失败。在root的设置中,什么可能会改变什么?在哪里 OS X version: 1

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

read -r -d '' FILE_CONTENTS <<'EOF'
... contents ...
EOF
这就像用户
tinosino
一样工作正常,但是。。。作为根。。。任何带有反斜杠的东西都有问题

为什么??从哪里寻找“差异”?选择?环境“echo”(?!)上的别名我迷路了。也尝试了
bash-x
:我正在测试的脚本上出现了一页又一页的失败。在root的设置中,什么可能会改变什么?在哪里

OS X version: 10.8.2
Bash version: 3.2.48(1)-release
我在脚本中有一个
sh
Vs
bash
guard,但它不起作用。。。它建造得不好吗

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
运行脚本。。。我怎么能这么做

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


这将是另一种方法:

#!/bin/bash
(
cat <<'EOF'
let mapleader = "<space>"
let maplocalleader = "\\"
EOF
) > .vimrc
#/bin/bash
(
cat.vimrc

别忘了root通常以#!/bin/sh的形式运行脚本

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

注意到你对BASH_版本的测试。好主意。我打赌它不会达到你期望的效果,因为
=
。试试
-eq
。我没有一个真正的Bourne Shell来测试


抱歉,祝你好运。

#!/bin/bash!=#!/bin/sh。祝你好运。这是一种扭曲的文件写入方式。你为什么要使用变量?@Mat:不,事实上,我认为这一点都不扭曲。否则,你如何将要写入的文件的内容传递给一个应该过滤和转储内容的函数,而不将内容写入磁盘?(为什么不?竞争条件,它们可能是在传输过程中读取的,不应该发生)。如果您知道一个改进,请建议。冷静下来。您没有太多的精力继续“任何带有反斜杠的东西都有问题”有什么问题?我正在测试的脚本上出现了一页又一页的失败请显示前几行错误。首先,您正在玩vi(1),你是否把.virc搞砸了,以致于它产生了不正确的脚本文件?@cdarke:看,问题是我让它用sh而不是bash运行,如果你测试它,这对我描述的习惯用法来说是难以理解的!谢谢,但是你能用一种比我更好的方式将文件内容传递给bash函数的情况来修改你的输入吗我需要什么?
if [[ ! $(ps -p $$ -o comm | paste -s - | awk '{ print $NF }') == *bash* ]]; then
#!/bin/bash
(
cat <<'EOF'
let mapleader = "<space>"
let maplocalleader = "\\"
EOF
) > .vimrc