首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在solaris上转义heredoc中的换行符

问在solaris上转义heredoc中的换行符
EN

Stack Overflow用户
提问于 2014-05-07 15:06:39
回答 2查看 388关注 0票数 1

我正在使用bash,这在Linux上是可行的:

代码语言:javascript
复制
read -r -d '' VAR<<-EOF
  Hello\nWorld
EOF

echo $VAR > trail

也就是说,Linux上文件的内容是

代码语言:javascript
复制
Hello\nWorld

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

代码语言:javascript
复制
Hello
World

换行符(\n)将被换行符替换。我怎么才能避免呢?

这是本文档的问题还是回送命令的问题?

更新

根据提供的解释,这里:

代码语言:javascript
复制
echo -E $VAR > trail

在Solaris上工作得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-07 15:46:21

补充@另一个人的回答很有帮助

即使在bash 正在执行脚本时,观察到的行为--默认情况下解释转义序列(如 \n )--也有几种方法可以实现E 219

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

运行脚本时通常不会继承这些选项,但是仍然有一些方法可以使生效。

  • 如果您的交互式初始化文件(例如,~/.bashrc)包含上述命令和您的~/.bashrc (.)命令,则您的脚本来自交互式shell。
  • 当不获取脚本时:如果您的环境包含指向脚本的BASH_ENV变量,则该脚本是在脚本运行之前获得的;因此,如果该脚本包含上述命令,它们将影响您的脚本。
票数 1
EN

Stack Overflow用户

发布于 2014-05-07 15:14:48

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

您可以在所有平台上使用printf (这是一个很好的实践)来避免这种情况:

代码语言:javascript
复制
printf "%s\n" "$VAR"

顺便说一下,这对bash来说不是个问题。如果您使用#!/usr/bin/env bash作为shebang (而且也没有使用sh script运行脚本),则行为应该是一致的。

如果您使用#!/bin/sh,您将得到系统作为默认值使用的任何shell,这些shell的行为都是不同的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23521510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档