Bash shell脚本-尝试不使用tmp文件
没有tmp1和tmp2我怎么能做到这一点? (信息文件很好) fin_func供您参考。(这不是真正的func,我不想更改它,只是想让您了解我如何使用tmp2和info_文件2)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-
这应该是可行的,尽管它相当不全面:
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
重试-请参阅