tee命令创建空文件。

3

我有一个股票列表,它是由程序生成的,并且被放置在名为awk_1的文件中。

dfs
fsd
dsf
sdf

我接着运行以下一行代码,生成正确的URL链接。
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;这可能是为什么?

我已经四处搜寻为什么它不起作用 - 任何帮助都将不胜感激。


1
你是在尝试使用 $( ) 作为引号吗?你似乎正在尝试将 URL 作为命令运行。如果你想让 echo 的输出成为 tee 的输入,你需要使用管道符。 - tabstop
@user1380599 请将代码块和输入文件距离行首留四个空格(选中所有代码并按下“{}”),这样它就会以代码形式出现,否则格式会被破坏,代码实际上会变得难以阅读(难以直接阅读)。 - Reinstate Monica Please
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行执行此操作。

3
如果你想要同时存储标准错误输出,可以将 | 改成 |&(适用于 bash 4+),或者使用 2>&1 |。不确定用户是否需要在这种情况下存储标准错误输出,但这可能会有所帮助。 - Reinstate Monica Please
1
@user1380599 如果这个答案解决了你的问题,请点击答案旁边的勾号标记为已解决。 - Reinstate Monica Please

0

关于出了什么问题,你这里有几个基本语法错误。

  • echo $(http://something) 尝试将 http://something 作为命令运行,然后将其输出作为字符串传递给 echo。当然,在您的情况下,http://something 不是有效的命令,因此您会收到“未找到”错误消息。
  • echo $(http://something) tee fileecho 传递了三个参数;其中两个是 teefile,因此它实际上根本不会运行 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/,其中 regex 匹配整个输入行,并且替换中的 & 会调用 regex 匹配的文本。

也许还可以访问 https://shellcheck.net/,它应该能够指出至少部分错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接