在bash中,如何在命令行上处理所有用户输入

时间:2016-01-12 12:43:29

标签: bash input sed stdin

如何在命令行上将所有用户输入作为程序的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'

但不是用户输入。

2 个答案:

答案 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

如果您对回显默认返回值的行进行注释,那么您将获得所要求的输出。