带有用户输入的源脚本

带有用户输入的源脚本

我有一个类似的脚本

#!/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 编写源代码。

相关内容