Linux Bash |管道到Bash函数
在尝试通过管道连接到Bash函数时,我编写了以下代码:Linux Bash |管道到Bash函数,linux,bash,function,pipe,stdin,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
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
示例(){
如果[-z${1+x}];那么本地S=${@:-$(ifbash
负责核心转储,这肯定表明bash
中有一个应该报告的错误。但是,您的函数可以更简单地编写为
example () {
local S
if (( "$#" == 0 )); then
IFS= read -r S
set -- "$S"
fi
echo "${1// /_}"
}
这至少可以避免该错误。我不建议将整个stdin读入变量。而不是:
#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
#主“worker”函数始终使用标准输入/输出
示例_worker(){tr''.}
#切换器
example(){if[-z“$1”];那么example\u worker;else example\u worker Who core?Bash?Trytype
文件也应该提供文件名。请告诉我在哪里使用文件
?FYI--本地var=$(something)
实际上是一个反模式,因为它的退出状态为local
(始终成功)与其说是something
的退出状态,不如说是local var;var=$(something)
。另外,只看$1
是否为空,然后连接所有$@
(顺便说一句,这不是指定给字符串的行为——在这种情况下,请使用$*
)。如果您想查看是否有任何参数,请查看$#
——否则,示例“”“hello”
将尝试从stdin中读取。为什么您说这更简单(去掉仅作为示例给出的tr'.
部分,它可以是其他任何内容)?你的代码更有效吗?我发现它更难理解。特别是集合--“$S”
部分。它是怎么不起作用的,还是你在尝试示例MoizèS Júnior
而不是示例“MoizèS Júnior”
集合--“$S”
将$1
设置为等于“$S”
。仅仅因为不熟悉的东西不会使它变得复杂。(旁白:Rich Hickey的演讲“简单变得容易”,很好地将所有这些概念区分开来,帮助人们分别思考它们……他建议使用“反编译”一词).@chepner,…我在这里可能做的唯一更改是IFS=read-r-d'S | |[$S]]
或诸如此类,以便能够读取多行字符串。假设我有许多函数,如“example_worker1”、“example_worker2”、“example_worker3”、“example_worker4”…所有这些函数都具有类似的行为“example_worker”是你的。你将如何处理这个问题@jm666?@Roger你不清楚你想要实现什么。你想连续呼叫多个工人(顺序-也就是像管道一样?)还是一次只呼叫一个工人,但基于某些条件?你需要在寻求帮助时保持清晰。这个问题已经得到了答案,因此可能是最好用新的方式问一个新问题(更精确地定义)情况下,而且您的示例代码并没有试图调用“多个”工作者。。。