我使用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][/]
#
答案 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;