如何在命令行上将所有用户输入作为程序的stdin?
在我的情况下,我想替换用户输入的某些单词。例如,每次用户使用单词animal1
时,我都希望将其作为goldfish
收到。所以它看起来像这样:
$ animal1
goldfish: command not found
我尝试了以下bash命令
while read input
do
sed "s/animal2/zebra/g;s/animal1/goldfish/g" <<< "$input"
done
但它会提示用户输入并且不会返回bash。我希望它在使用bash命令行时运行。
此外,这使我只能捕获输出。
bash | sed 's/animal2/zebra/g;s/animal1/goldfish/g'
但不是用户输入。
答案 0 :(得分:3)
如果我理解正确,听起来你只需要设置一些别名:
$ alias animal1=goldfish
$ animal1
bash: goldfish: command not found
这允许像往常一样以交互方式使用shell,但会进行所需的替换。
您可以将此别名定义添加到其中一个启动文件(通常为~/.bashrc
或~/.profile
),以使它们对您打开的任何新shell生效。
答案 1 :(得分:2)
Tom Fenech提供的解决方案很好,但是,如果您计划在命令中添加更多功能,则可以使用如下功能:
animal1() {
echo "Welcome to the new user interface!"
goldfish
# other commands
}
并将其放在用户~/.bashrc
或~/.bash_profile
输出将是:
$>animal1
Welcome to the new user interface!
-bash: goldfish: command not found
通过使用此方法,您可以创建自定义输出消息。在下面的代码片段中,我从命令中获取返回值并逐字处理。然后我删除输出的-bash:
部分并重新构造消息并输出它。
animal1() {
echo "Welcome to the new user interface!"
retval=$(goldfish 2>&1)
# Now retval stores the output of the command glodfish (both stdout and stderr)
# we can give it directly to the user
echo "Default return value"
echo "$retval"
echo
# or test the return value to do something
# here I build a custom message by removing the bash part
message=""
read -ra flds <<< "$retval"
for word in "${flds[@]}" #extract substring from the line
do
# remove bash
msg="$(echo "$word" | grep -v bash)"
# append each word to message
[[ msg ]] && message="$message $msg"
done
echo "Custom message"
echo "$message"
echo
}
现在输出将是:
Welcome to the new user interface!
Default return value
-bash: goldfish: command not found
Custom message
goldfish: command not found
如果您对回显默认返回值的行进行注释,那么您将获得所要求的输出。