Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash |管道到Bash函数_Linux_Bash_Function_Pipe_Stdin - Fatal编程技术网

Linux 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

在尝试通过管道连接到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
示例(){

如果[-z${1+x}];那么本地S=${@:-$(if
bash
负责核心转储,这肯定表明
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?Try
type
文件也应该提供文件名。请告诉我在哪里使用
文件
?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你不清楚你想要实现什么。你想连续呼叫多个工人(顺序-也就是像管道一样?)还是一次只呼叫一个工人,但基于某些条件?你需要在寻求帮助时保持清晰。这个问题已经得到了答案,因此可能是最好用新的方式问一个新问题(更精确地定义)情况下,而且您的示例代码并没有试图调用“多个”工作者。。。