在solaris上的heredoc中逃脱换行符

时间:2014-05-07 15:06:40

标签: linux bash solaris heredoc

我正在使用bash,这适用于Linux:

read -r -d '' VAR<<-EOF
  Hello\nWorld
EOF

echo $VAR > trail

即Linux上的文件内容是

Hello\nWorld

当我在Solaris上运行时 试用文件

Hello
World

换行符(\ n)正在换行换行符。我怎么能避免呢?

heredoc或echo命令有问题吗?

[UPDATE]

根据提供的解释here

echo -E $VAR > trail

在Solaris上运行良好。

2 个答案:

答案 0 :(得分:4)

问题在于echo。行为定义为in POSIX,其中解释\n是XSI的一部分,但不是基本的POSIX本身。

您可以在使用printf的所有平台上避免这种情况(无论如何这都是好的做法):

printf "%s\n" "$VAR"

顺便说一句bash这不是问题。如果您使用#!/usr/bin/env bash作为shebang(并且也不使用sh script运行脚本),则行为将保持一致。

如果您使用#!/bin/sh,您将获得系统使用的任何shell作为默认值,具有不同的行为。

答案 1 :(得分:1)

补充@that other guy's helpful answer

即使 bash执行您的脚本,观察到的行为有多种方式 - echo默认解释转义序列,例如{{ 1}} - 可以来

  • \n可能有效,默认情况下会使shopt -s xpg_echo内置解释echo转义序列。
  • \可能会生效,默认情况下会禁用enable -n echo 内置并运行外部可执行文件 - 并且可执行文件&#39;的行为是依赖于平台的

这些选项通常在您运行脚本时不会继承,但仍然有方式可以生效

  • 如果您的交互式初始化文件(例如echo)包含上述命令,并且 ~/.bashrc source)您的脚本来自交互式shell
  • 当您没有采购脚本时:如果您的环境包含指向脚本的 . 变量,则在脚本运行之前该脚本 sourced ;因此,如果该脚本包含上述命令,则会影响您的脚本。