shell 使用 EOF 解决交互输入时,如何在 EOF 中使用变量?

2022-03-09 17:48:15 +08:00
 jellyspot
pwd="123456"

passwd root <<EOF
$pwd
$pwd
EOF

我这样写,发现 EOF 中,不认我这个变量,想问下,这个在 shell 中应该怎么实现

1897 次点击
所在节点    程序员
14 条回复
hsfzxjy
2022-03-09 18:02:24 +08:00
是可以的,有没什么报错
jellyspot
2022-03-09 18:03:49 +08:00
@hsfzxjy 执行的结果就是不会替换,$pwd 就是$pwd
xuboying
2022-03-09 18:04:59 +08:00
这个东西叫“here doc”,搜一下就有详细教程了
thedrwu
2022-03-09 18:05:26 +08:00
认,但是 passwd 是否直接从 stdin 读或者读之前会不会 flush 又是另一个问题
swulling
2022-03-09 18:06:42 +08:00
$ cat i.sh
#!/bin/bash
pwd="123456"

cat <<EOF
a
$pwd
b
c

EOF

$ bash ./i.sh
a
123456
b
c



这不是正常替换了么
swulling
2022-03-09 18:07:29 +08:00
你这个问题是 passwd ,建议这么用
echo "NEWPASSWORD" | passwd --stdin root

passwd 支持从标准输入读取
bufbz
2022-03-09 18:11:44 +08:00
cat > ~/.pip/pip.conf << 'EOF'
[global]
index-url = http://mirrors.aliyun.com/pypi/simple
[install]
trusted-host=mirrors.aliyun.com
EOF


EOF 加单引号即可。
bufbz
2022-03-09 18:13:12 +08:00
看错了,这个是去变量,默认就是可以调用变量。
hsfzxjy
2022-03-09 18:14:09 +08:00
haoliang
2022-03-09 19:18:19 +08:00
`yes $pwd | passwd root`
fuxkcsdn
2022-03-09 23:16:05 +08:00
#10 正解,一般需要输入密码的地方都是用 yes 命令
iqfEmhuNidBhDfWo
2022-03-09 23:26:30 +08:00
楼主这情景和我上一帖一样啊~
①heredoc 默认就是会解释变量的
②如果想不解释变量,可以在该字符串前加反斜杠转义,或者使用一对单引号闭合第一个 endpoint keyword (大家都习惯使用 EOF )
③回到楼主的操作上来,不管是"</path/to/file"表示标准输入重定向自文件,还是"<<keyword"表示标准输入重定向自 heredoc ,passwd 默认都不吃这一套,所以你需要加上楼上所说得--stdin 可选项
④另外顺便一说,楼主这需求也可以拿 expect 或者 socat 来实现
mhycy
2022-03-10 00:01:47 +08:00
修改密码的操作有文档建议使用的命令是 chpasswd
Alliot
2022-03-10 12:42:12 +08:00
passwd 有参数直接读取标准输入面交互 :
``` shell
echo 'xxx' | passwd --stdin user
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/839197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX