我编写了一个脚本 ( fetch.sh
),使用 在 PDF 文件(旧的数字化 OCR 报纸)中搜索术语PDFGREP
。它工作得很好。它会提示用户输入搜索词 ( foo
) 和要搜索的文件 ( year.pdf
)。
我想将输出捕获到日志中,同时仍在屏幕上显示结果。我成功地用了| tee log
3 种方法
从提示:
fetch.sh | tee log
从提示:
fetch.sh | tee log.foo
在脚本中我可以这样做:
( fetch.sh ) | tee log
我真正想要的是将其作为其中的一部分fetch.sh
但采用以下格式log.foo
(文件格式为 2.但执行为 3)。
我已经fetch.sh
尝试过:
) | tee log.$foo
... 生成名为log.
) | tee log."$foo"
... 生成名为log.
) | tee log.'$foo'
... 产量log.$foo
(字面意思,没有替代$foo
)) | tee log.${foo}
... 生成名为log.
) | tee log."${foo}" ... yields file named
日志。`) | tee log.'${foo}'
... 产量log.${foo}
(字面意思,没有替代$foo
)
在所有情况下,输出都正确捕获,但文件名始终不是我想要的。我做错了什么?
答案1
您遇到的问题是,通过使用( ... )
,您将在当前进程的子 shell 中运行所有命令。由于此子 shell 是子进程,因此您分配的任何变量都不会传递给父进程(您的主脚本)。这意味着变量永远不会到达您的tee
命令。
解决方案非常简单,在脚本中,您必须在开始括号之前分配变量,然后该变量才可供命令使用tee
。
例如,如果您要添加的文件扩展名是.txt
:
foo=txt
(
commands from fetch.sh
) | tee log."$foo"
请注意,我使用了双引号,shell 会将其扩展,以确保在扩展名包含空格(这种情况不太可能发生)的情况下,它在扩展后仍然完好无损。
如果您需要从 fetch.sh 内部进行设置foo
,则需要使用另一种方法对脚本的命令进行分组。