我有一个类似的脚本
#!/bin/bash
echo -n "User: "
read -e username
echo -n "Password: "
read -es password
export http_proxy="http://$username:$password@localhost:40080"
export https_proxy="http://$username:$password@localhost:40080"
$@
unset http_proxy
unset https_proxy
它读取用户/密码,导出代理,运行我需要代理的命令,然后清理它。有用。但我尝试这样做:
#!/bin/bash
echo -n "User: "
read -e username
echo -n "Password: "
read -es password
export http_proxy="http://$username:$password@localhost:40080"
export https_proxy="http://$username:$password@localhost:40080"
所以我可以source proxyscript
(并且能够在整个会话中使用代理,而无需每次都输入用户/通行证),它等待输入,但导出http://:@localhost:40080
那么,我做错了什么或者我怎样才能让它发挥作用?
(我知道我可以将其作为 args 并使用$1
/$2
或类似的东西,但我想避免必须在历史记录中打开密码)
编辑/解决方案:
在答案的基础上,一个小小的改变就足以使其与bash
和兼容zsh
:
#!/bin/bash
echo -n "User: "
read username
echo -n "Password: "
read -s password
export http_proxy="http://$username:$password@localhost:40080"
export https_proxy="http://$username:$password@localhost:40080"
基本上,只是删除了e
标志。
答案1
我不太明白为什么它不起作用,它对我来说效果很好:
$ source foo.sh
User: terdon
Password: ~ $ ## I entered the password here, you can add an echo to clear the line
$ echo "$http_proxy"
http://terdon:myPass@localhost:40080
$ echo "$https_proxy"
http://terdon:myPass@localhost:40080
我会使用,read -p
代替echo
, 并添加一个空echo
来清除该行,但除此之外,您的方法应该有效:
#!/bin/bash
read -p "User: " -e username
read -p "Password: " -es password
echo ""
export http_proxy="http://$username:$password@localhost:40080"
export https_proxy="http://$username:$password@localhost:40080"
您现在可以这样做. foo.sh
(或者source foo.sh
因为您正在使用 bash)并且它应该按预期工作。
答案2
ZSH 不是 bash; shell 具有不兼容的read
内置函数。bash
:
-e 如果标准输入来自终端,则使用 readline(参见上面的 READLINE)来获取该行。 Read-line 使用当前(或默认,如果行编辑之前未激活)编辑设置,但使用 Read-line 的默认文件名完成。
中山:
-e -E 将读取的输入打印(回显)到标准输出。如果使用 -e 标志,则不会将任何输入分配给参数。
所以read -e
在ZSH 中bash
是一些 readline 的东西,而read -e
在 ZSH 中只是回显。如果您想source
使用 ZSH 对代码进行 shell,则必须为 ZSH 编写源代码。