tee 命令创建空文件

问题描述 投票:0回答:2

我有以下生成的股票列表,它被放置在名为

awk_1

的文件中
dfs
fsd
dsf
sdf

然后我运行以下一个生成正确 ULR 链接的班轮

while read i ; do 
  echo $(http://uk.finance.yahoo.com/echartss=$i#symbol=$i\;range=my\;compare=\;indicator=volume\;charttype\=area\;crosshair\=on\;ohlcvalues\=0\;logscale\=off\;source\=undefined\;) tee stock_urls; 
done < awk_1 

但是没有将输出放在名为

stock_urls
的文件中?

它还在屏幕上生成奇怪的输出,下面是我得到的标准输出的一小部分输出。它把

./large_cap_stocks.sh: 51: ./large_cap_stocks.sh:
放在前面,
not found
放在最后;为什么会这样?

我一直在上下搜索为什么这不起作用 - 任何帮助将不胜感激。

bash list loops tee
2个回答
2
投票

你可能打算这样写:

while read i; do
    echo "http://uk.finance.yahoo.com/echarts?s=$i#symbol=$i\;range=my\;compare=\;indicator=volume\;charttype\=area\;crosshair\=on\;ohlcvalues\=0\;logscale\=off\;source\=undefined\;"
done < awk_1 | tee stock_urls

即:

  • echo
    命令中,使用
    "..."
    来引用您的文本,而不是
    $(...)
    ,这是别的东西
  • 使用管道运算符
    |
    将输出传递给
    tee
    ,您可以通过这种方式对整个循环进行管道传输,无需为单独的
    echo
    行执行操作。

0
投票

至于哪里出了问题,你这里有几个基本的语法错误。

  • echo $(http://something)
    尝试将
    http://something
    作为命令运行,然后将其输出作为字符串传递给
    echo
    。当然,在您的情况下,
    http://something
    不是有效命令,因此这就是您收到
    not found
    错误消息的原因。
  • echo $(http://something) tee file
    将三个参数传递给
    echo
    ;其中两个是
    tee
    file
    ,所以它实际上根本不会运行
    tee
  • 如果你修复了这个问题,在循环内一次又一次地运行
    tee
    将覆盖每次迭代中的输出文件,最终只得到文件中最后一次循环迭代的输出。
  • 切线地,
    echo
    论证中的迷信反斜杠是多余的。等号根本不是 shell 元字符,双引号字符串中的分号仅表示文字分号字符本身。

最小的修复看起来像

while read i ; do 
    echo "http://uk.finance.yahoo.com/echartss=$i#symbol=$i;range=my;compare=;indicator=volume;charttype=area;crosshair=on;ohlcvalues=0;logscale=off;source=undefined;" |
     tee -a stock_urls
done < awk_1

但更好的解决方法是避免从循环内部重定向;

while read i ; do 
    echo "http://uk.finance.yahoo.com/echartss=$i#symbol=$i;range=my;compare=;indicator=volume;charttype=area;crosshair=on;ohlcvalues=0;logscale=off;source=undefined;"
done < awk_1 | tee stock_urls

更好的解决方案仍然是用单行(或者,好吧,双行)替换这个粗糙的 和缓慢的 循环;

sed 's|.*|http://uk.finance.yahoo.com/echartss=&#symbol=&;range=my;compare=;indicator=volume;charttype=area;crosshair=on;ohlcvalues=0;logscale=off;source=undefined;|' awk_1 |
tee stock_urls

这使用

sed
命令
s/regex/replacement/
正则表达式匹配整个输入行,替换中的
&
调用正则表达式匹配的文本。

也许还可以访问 https://shellcheck.net/ 应该能够指出至少其中一些错误。

© www.soinside.com 2019 - 2024. All rights reserved.