Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Bash shell脚本-尝试不使用tmp文件_Bash_Shell - Fatal编程技术网

Bash shell脚本-尝试不使用tmp文件

Bash shell脚本-尝试不使用tmp文件,bash,shell,Bash,Shell,没有tmp1和tmp2我怎么能做到这一点? (信息文件很好) fin_func供您参考。(这不是真正的func,我不想更改它,只是想让您了解我如何使用tmp2和info_文件2) 这应该是可行的,尽管它相当不全面: cat information_file2 | fin_func <(cat <(echo Messi) <(cat information_file1 | \ sed -e 's/\,/\ /g' | grep Ronaldo | cut -d"=" -f2-

没有tmp1和tmp2我怎么能做到这一点? (信息文件很好)

fin_func供您参考。(这不是真正的func,我不想更改它,只是想让您了解我如何使用tmp2和info_文件2)


这应该是可行的,尽管它相当不全面:

cat information_file2 | fin_func <(cat <(echo Messi) <(cat information_file1 | \
  sed -e 's/\,/\ /g' | grep Ronaldo | cut -d"=" -f2-))

cat information_file2 | fin_func这应该是可行的,尽管它相当不全面:

cat information_file2 | fin_func <(cat <(echo Messi) <(cat information_file1 | \
  sed -e 's/\,/\ /g' | grep Ronaldo | cut -d"=" -f2-))

cat information_file2 | fin_func示例
fin_func
多次读取作为命令参数给出的文件,因此除非允许我们修改该函数,否则至少需要一个临时文件。问题中给出的示例
fin_func
可以很容易地修改,这样它就不会多次读取文件,但由于您指出这不是真正的脚本,我将假定它无法修改,并且必须将文件作为参数。也就是说,我会将您的脚本编写为:

trap 'rm -f $TMPFILE' 0  # in bash, just trapping on 0 will work for SIGINT, etc 
TMPFILE=$( mktemp ) 

{ echo Messi
tr , ' '  < information_file1 | 
awk -F= '/Ronaldo/{print $2}' ; } > $TMPFILE
< information_file2 fin_func $TMPFILE
trap'rm-f$TMPFILE'0#在bash中,仅在0上进行trap将对SIGINT起作用,等等
TMPFILE=$(mktemp)
{埃科·梅西
tr,“$TMPFILE

我强烈怀疑可以重写
fin_func
,这样就不需要常规文件作为输入。此外,不需要使用
tr
,因为您可以在
awk
中只在匹配行上使用
gsub
,并节省一些处理,但这可能是一个微不足道的优化。但是,使用
tr
而不是
sed
在美学上是必要的。

示例
fin_func
多次读取作为命令参数给出的文件,因此除非允许我们修改该函数,否则至少需要一个临时文件。问题中给出的示例
fin_func
可以很容易地修改,这样它就不会多次读取文件,但由于您指出这不是真正的脚本,我将假定它无法修改,并且必须将文件作为参数。也就是说,我会将您的脚本编写为:

trap 'rm -f $TMPFILE' 0  # in bash, just trapping on 0 will work for SIGINT, etc 
TMPFILE=$( mktemp ) 

{ echo Messi
tr , ' '  < information_file1 | 
awk -F= '/Ronaldo/{print $2}' ; } > $TMPFILE
< information_file2 fin_func $TMPFILE
trap'rm-f$TMPFILE'0#在bash中,仅在0上进行trap将对SIGINT起作用,等等
TMPFILE=$(mktemp)
{埃科·梅西
tr,“$TMPFILE


我强烈怀疑可以重写
fin_func
,这样就不需要常规文件作为输入。此外,不需要使用
tr
,因为您可以在
awk
中只在匹配行上使用
gsub
,并节省一些处理,但这可能是一个微不足道的优化。但是,使用
tr
而不是
sed
在美学上是必要的。

什么是fin_func,它可以从管道/stdin获取输入,而不是从管道/stdin获取文件名并读取?fin_func是一个获取输入的函数(在读取时使用info_file2),还可以使用tmp2作为参数($1-例如do in fin_func grep$1…)你知道
grep
不会被执行吗?它只是一个字符串,如果您希望执行它,它将丢失
```
$(…)
;阅读时在
之后执行
——一行
和一个
介于
]]
之间,然后
。与其
[
比较
grep
的输出和空字符串,不如
如果grep-q“$line”$1;那么
什么是fin\u func,它可以从管道/stdin获取输入,而不是从那里获取文件名并读取?fin\u func是一个获取输入的函数(带while read的info_file2)并将tmp2用作参数($1-例如fin_func grep$1中的do…)您知道不会执行
grep
吗?它只是一个字符串,没有执行
``.
$(…)
如果您想执行它。您在读取时也缺少一个
;do
之后-一行
和一个
]
之间,然后
。而不是
[
并将
grep
的输出与空字符串进行比较,您想要
如果grep-q“$line”$1;然后
就不起作用了。我想在我的代码tmp2中是一个参数,在fin#func中我把它作为$1使用。这里它只是常规输入。记住它不是bash,它是sh.@KobiGuetta So Bourne Shell或者哪个Shell?它的#!/bin/sh。所以我认为它是常规输入shell@KobiGuetta
/bin/sh--version
打印什么?@KobiGuetta,@Gumbo:当它是
b时ash,
由于被调用为
sh
,因此它在POSIX兼容模式下运行,在这种情况下不支持进程替换。因此,请使用shebang
#!/usr/bin/env bash
而不是
#!/bin/sh
-请参见,我认为代码中的原因tmp2是一个参数,在fin func中,我将其用作$1。此处它只是常规的输入。记住它不是bash,它是sh.@KobiGuetta So Bourne Shell还是哪个Shell?它是#!/bin/sh。所以我认为它是常规的shell@KobiGuetta
/bin/sh--version
打印什么?@KobiGuetta,@Gumbo:虽然它是
bash,
但由于被调用为
sh
,它在POSIX兼容模式下运行,其中不支持案例进程替换。因此,请使用shebang
#!/usr/bin/env bash
而不是
#!/bin/sh
重试-请参阅