Bash |管道到bash功能

时间:2017-03-10 13:03:35

标签: linux bash function pipe stdin

在尝试使用Bash函数时,我写了这个:

example () {
    if [ -z ${1+x} ]; then local S=${@:-$(</dev/stdin)}; else local S="$1"; fi
    #echo "$S"
    echo "$S" | tr ' ' '_'
}
echo 'Moizès Júnior' | example
example 'Moizès Júnior'

Moizès_Júnior
Moizès_Júnior

但是,在另一个上下文中,我收到了正确的输出以及此错误消息:“Segmentation fault(core dumped)”。

尝试调试它我问我在函数内部编写代码以获取STDIN的方式是否有问题。

非常感谢。

2 个答案:

答案 0 :(得分:2)

我不建议将整个标准输入读入变量。而不是:

#the main "worker" function always uses stdin/out
example_worker() { tr ' ' '_'; }

#the switcher
example() { if [[ -z "$1" ]]; then example_worker; else example_worker <<< "$1"; fi ; }

echo 'a b c' | example
example 'a b c'
#but also
example < multi_giga_file.txt

答案 1 :(得分:1)

如果bash负责核心转储,那肯定表明应该报告bash中的错误。但是,您的函数可以更简单地编写为

example () {
    local S
    if (( "$#" == 0 )); then
        IFS= read -r S
        set -- "$S"
    fi
    echo "${1// /_}"
}

至少可以避免这个错误。