我有一个
python
脚本,它是从 csh
脚本调用的(我无法使用 bash
)。 python 脚本打印出带有换行符的字符串,我将输出存储在 csh 变量中。但是,一旦我将其存储在变量中,我就会丢失所有换行符。以下是脚本:
python 脚本 (pcmd.py)
def main(op):
if op == "h": # print help
# below newline character is getting lost
print ("Help first line\n second line.")
else: # print and later execute csh commands
print ("setenv SOME_ENV_VAR 123; setenv ANOTHER asd")
if __name__ == "__main__":
import sys
main(sys.argv[1])
csh 脚本 (pcmd.csh)
# store the py script in a variable
set pcmd="./pcmd.py $*"
# store the output of the first eval command
set output=`eval "$pcmd"`
# if output contains setenv, eval the output (csh commands)
if ( "$output" =~ *setenv* ) then
eval "${output}"
else # otherwise, print the output
echo "${output}" # Issue : losing newline chars, tried echo -e too but of no avail
执行
pcmd.csh h
expects: Help first line
second line.
actual: Help first line second line. # missing newline character
有人可以指出脚本中缺少的部分,任何帮助将不胜感激。
干杯, DD
这就是 csh 的行为方式。从其手册页:
命令替换由“”括起来的命令表示。这 此类命令的输出在空白处被分解为单独的单词, 制表符和换行符以及空字将被丢弃。输出是 变量和命令被替换并代替原来的位置 字符串。
双引号 (`"') 内的命令替换保留空格并 选项卡;只有换行符才会强制产生新单词。最后的单个换行符确实 无论如何不要强行使用新词。因此可以使用命令 替换仅产生单词的一部分,即使命令输出 一条完整的线。
默认情况下,从 6.12 版本开始,shell 会替换所有换行符和 命令中的回车符由空格组成。如果这是 通过取消设置 csubstnonl 来关闭,换行符将命令分隔为 平常。
我最后一次使用 csh 是在 20 世纪 80 年代中期。我不相信你想做的事情是可能的。 Csh 是一个可怕的 shell。甚至比 Bash 这样的 POSIX shell 还要糟糕。即使您不能使用 Bash,是否有某些原因不能使用 /bin/sh?或者,更好的是,像 Fish 或 Elvish 这样的现代理智 shell?