Bash |管道到 bash 函数
Bash | pipe to bash function
在尝试通过管道传输到 Bash 函数时,我这样写:
example () {
if [ -z ${1+x} ]; then local S=${@:-$(</dev/stdin)}; else local S=""; 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 的方式是否有问题。
非常感谢。
如果 bash
负责核心转储,那肯定表明 bash
中存在错误,应该报告。但是,您的函数可以更简单地写成
example () {
local S
if (( "$#" == 0 )); then
IFS= read -r S
set -- "$S"
fi
echo "${1// /_}"
}
这至少可以避免错误。
我不建议将整个标准输入读入变量。而不是:
#the main "worker" function always uses stdin/out
example_worker() { tr ' ' '_'; }
#the switcher
example() { if [[ -z "" ]]; then example_worker; else example_worker <<< ""; fi ; }
echo 'a b c' | example
example 'a b c'
#but also
example < multi_giga_file.txt
在尝试通过管道传输到 Bash 函数时,我这样写:
example () {
if [ -z ${1+x} ]; then local S=${@:-$(</dev/stdin)}; else local S=""; 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 的方式是否有问题。
非常感谢。
如果 bash
负责核心转储,那肯定表明 bash
中存在错误,应该报告。但是,您的函数可以更简单地写成
example () {
local S
if (( "$#" == 0 )); then
IFS= read -r S
set -- "$S"
fi
echo "${1// /_}"
}
这至少可以避免错误。
我不建议将整个标准输入读入变量。而不是:
#the main "worker" function always uses stdin/out
example_worker() { tr ' ' '_'; }
#the switcher
example() { if [[ -z "" ]]; then example_worker; else example_worker <<< ""; fi ; }
echo 'a b c' | example
example 'a b c'
#but also
example < multi_giga_file.txt