如何在命令完成时输出

时间:2017-01-05 09:21:03

标签: linux bash concurrency stdout

我正在使用&运行多个命令:

curl "url1" --output /dev/null 2>> out &
curl "url1" --output /dev/null 2>> out &
wait

这不起作用,因为输出行是交错的。我希望每个curl保持其输出,直到完成。怎么做?

据我所知,我可以使用临时文件,连接在一起并在之后删除。还有更好的方法吗?

curl "url1" --output /dev/null 2>> out1 &
curl "url1" --output /dev/null 2>> out2 &
wait

1 个答案:

答案 0 :(得分:3)

您可以在子shell中执行每个<?php $productId = $this->getProduct_id(); $product = Mage::getModel('catalog/product')->load($productId); //load product ?> <div class="product"> <a href="<?php echo $product->getProductUrl() ?>" > <img class="product-img" src="<?php echo $this->helper('catalog/image')->init($product, 'image'); ?>"alt="<?php echo $this->htmlEscape($product->getName()) ?>" /> </a> </div> <div class="product-detail"> <P><?php // echo $this->htmlEscape($product->getName()) ?> <?php $prod_name = $this->htmlEscape($product->getName()); ?> <?php $count_str = strlen($prod_name); if ($count_str < 40) { echo $prod_name; } else { $offset = 0; $length = 41; $prod_name = html_entity_decode($prod_name); echo htmlentities(mb_substr($prod_name,0,$length,'utf-8')). "...";; } ?> </P> <!--?php $price = $product->getPrice() ; ?--> <?php $_product = Mage::getModel('catalog/product')->load($product->getId()); $productBlock = $this->getLayout()->createBlock('catalog/product_price'); ?> <span> <?php echo $productBlock->getPriceHtml($_product); ?> <?php $tier_price = end($_product->getTierPrice()); if($tier_price !='0'){ ?> <span>As Low As:</span> <?php echo "&nbsp; ₹&nbsp;".number_format( $tier_price['price']); } ?> <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo Mage::helper('checkout/cart')->getAddUrl($product); ?>')"> </span> </div>

curl

echo "$(curl "url1" 2>&1 >/dev/null)" >> out & echo "$(curl "url2" 2>&1 >/dev/null)" >> out & wait 将stderr重定向到标准输出。
是的,您可以使用subshel​​l命令2>&1嵌套"":)

下行:这可能无法保留输出顺序。如果第二个$()首先完成,则首先输出。

为了保持订购的输出,您可以使用curlcat。 Bash的进程替换 <()<(COMMAND)的输出创建一个临时文件(实际上,它是一个FIFO),但是你没有必须关心该临时文件的名称,创建和删除。

COMMAND

cat \ <(curl "url1" 2>&1 >/dev/null) \ <(curl "url2" 2>&1 >/dev/null) \ > out 转义换行符。没有\,一切都必须写在一行。