使用Docker,echo和Perl保留反斜杠

时间:2017-06-07 20:20:40

标签: bash perl docker

我使用perl以非常具体的方式调用docker exec,以便将信息回显到Docker容器中的/etc/bashrc

我需要将两个Perl变量插入到echo命令中。 $c_name的值通常为test1或其他内容。$net_ip的值通常为192.168.0.x

my $prompt = '[\A][' . $c_name . '][' . $net_ip . '][\w]\n\$ ';
`docker exec --privileged $c_name bash -c "echo -e 'PS1=$prompt' >> /etc/bashrc"`;

这个连续性的努力是关于此的第四次射击。我也试过了

`docker exec --privileged $c_name bash -c "echo -e PS1='[\A][$c_name][$net_ip][\w]\n\$ ' >> /etc/bashrc"`;

这些都不奏效。当我做docker exec -it test1 /bin/bash时,我得到一个如下所示的提示:

bash: $: command not found
[A][test1][192.168.0.13][w]

我的/etc/bashrc如下所示:

PS1=[\A][test1][192.168.0.13][\w]
$

现在这有点正确。看起来它没有逃脱\n\$这是一个问题。但更令人担忧的是提示不尊重那里的\A\w。即使我从容器中执行source /etc/bashrc,我仍然从Bash收到上面的错误消息,我的提示保持不变。是否与Docker和我不知道的$ PS1有一些奇怪的互动?

我想要的是在我/etc/bashrc的末尾我想要这条线存在,逐字存在,插入Perl $ vars:

[\A][$c_name][$net_ip][\w]\n\$ 

,在Perl解释之后,可能看起来像:

[\A][test_container][10.0.0.2][/home/docker]
$ 

我也尝试了其他尝试,例如尝试使用双\\来逃避反斜杠(例如[\\A],但是,Perl会抱怨无法识别转义字符(&#34) ; $ linenumber中无法识别的转义选项)或者它只是具有与上面相同的结果,其中反斜杠未放入/ etc / bashrc。

请注意,当我在容器中执行时:

export PS1='[\A][test1][192.168.0.13][\w]\n\$ '

然后提示是正确的:

[20:26][test1][192.168.0.13][/]
#

1 个答案:

答案 0 :(得分:0)

我会通过标准输入将提示提供给docker,而不是按原样使用bash。然后你只需要运行一个命令tee -a /etc/bashrc;它将继承docker的标准输入,其标准输入是文件句柄$fh

open my $fh, "|-", "docker exec --privileged '$c_name' tee -a /etc/bashrc";
printf $fh "PS1=$prompt\n";
close $fh;