Shell 命令在终端和脚本中执行的方式不同

Shell 命令在终端和脚本中执行的方式不同

以下命令序列

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch

当在终端中执行或通过source给出输出时

b\\_d

当作为 scipt 运行时

sh script.sh

其中脚本内容是:

#!/bin/bash                                                                                                                                   
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch

输出是

b\_d

终端的输出是首选输出。使用shell脚本的解决办法是什么?也被接受为答案的是如何修改的想法

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`

为了sh

我使用 bash shell:

echo $0
bash

答案1

sh不同于bash并且行为不同。

我想sh确实如此dash

顺便说一句:如果您检查不同的 shell,此命令会有不同的行为。

bosh, dash, mksh,zsh以及ksh在 Solaris 上打印一个反斜杠

bashkshLinux 上打印两个反斜杠。

通过查看 $shell -x 输出,我相信一个反斜杠是正确的输出。

我不知道为什么ksh在 Linux 上会有这样的行为。它可能试图模仿bash行为。

对于bash该行为可以解释为:bash 有一个非 POSIX echo,它不会按照 POSIX 的要求解释反斜杠。

POSIX 只允许在小型嵌入式系统上进行行为,否则 POSIX 需要实现bash所谓的扩展。XSI对于,这需要完全遵循AT&T 于 1982 年为 SYSv 实施echo的行为。echo

重要提示:

如果您有一个以以下开头的脚本

#!/bin/bash

这是可执行的(x由设置的位chmod),如果你调用

sh myscript

/bin/sh该脚本仍然在Linux 上运行dash。因此,请注意运行代码的方式。

有一种方法可以避免您的问题。更改您的脚本以使用:

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch

echo这样,您就可以避免1989 年引入的问题bashprintf仍然不能解决所有问题,因为存在许多错误的实现,但是参数中的反斜杠引起的常见问题不受printf.

相关内容