2013-05-26 78 views
0

我一直在用這個「玩弄」一段時間,對於我剛剛解決的大多數問題,現在我需要解決這個問題。爲什麼一些「if」測試不能在我的cron腳本中工作

爲什麼基本上我所有的cron作業不具有「如果測試」

讓我在shell中運行它採取這一

if [ "$line" == "downloads.php" ] 

作品精美絕倫,當我啓動它的cron工作工作只是從來沒有工作。變通辦法

if echo "$line" | grep -q "downloads.php" 

雙向工作。這是爲什麼?對於第一個[]基本上代表「測試」,第二個很好,它只是一個grep。但爲什麼「測試」不能在我的cron作業中工作? (有或沒有重定向到>空)

我目前需要這一個在cron工作,現在我真的不知道如何解決,或基本上我只是最終想了解如何解決這個問題,什麼我做錯了。

while [[ "${ofile: -1}" != "_" ]] 

這個只是產生一個錯誤「87:壞替代」,這樣做,直到第一個字符是「_」

我設法克服cron的所有問題,從完整路徑,對環境,這一個對我來說仍然是一個難題。任何幫助表示讚賞。

+0

grep的也將匹配,如果'downloads.php'是線的一部分,而不是整個行。 – Noctua

+0

'$ line'從哪裏來?請注意,「cron」作業的工作目錄可能與您在「cron」之外進行測試時所處的目錄不同。因此,根據'$ line'的生成方式,這可能是不同的。 – lurker

+2

看起來您正在通過'/ bin/sh'執行cron中的代碼,但手動爲'/ bin/bash'。 – jordanm

回答

2

聽起來你正在用bash運行腳本,而cron正在其他shell下運行;因此,你使用的所有bash擴展都失敗了。確保腳本中的shebang(即第一行)請求bash(#!/bin/bash),並且cron條目直接運行它,而不是指定shell(例如,0 0 * * * /path/to/script不是0 0 * * * /bin/sh /path/to/script)。

編輯:有控制的幾種不同的方法,其外殼將被用來解釋一個腳本,具有一定的優先順序:

  1. 如果用一個明確的外殼運行腳本(如/bin/sh /path/to/script)時,你告訴運行它的shell將被使用,並且任何shebang都將被忽略。
  2. 如果您直接運行該腳本(例如,/path/to/script./script,或將其放置在PATH中,並將其作爲script運行),系統將使用shebang來確定要使用哪個shell(或其他解釋器)。
  3. 如果你直接運行它,並沒有shebang,你運行它的程序(例如bash,sh或crond)可能選擇做別的事情。在這種情況下,bash會用bash運行腳本。我不確定crond會做什麼,甚至可能取決於它是哪個版本。

一般來說,使用合適的shebang並直接運行腳本是最好的方法;劇本應該「知道」合適的翻譯是什麼,並且應該受到尊重。例如,如果你在可移植的shell代碼中編寫腳本(帶有一個012bshebang),然後以後需要使用一些僅限bash的功能,則可以簡單地更改shebang,而不必追蹤它運行的所有位置。

顯式指定shell應該保留用於shebang錯誤或丟失的情況(在這種情況下,更好的解決方案是修復腳本),或者您沒有執行權限(再次修復腳本)。第三種選擇是不可靠的回退,應儘可能避免。

P.s.如果我正確地閱讀了最後一條評論(上面),則要測試$ line 是否包含「downloads.php」,而不是它是否等於;但[ x == y]比較測試爲平等,而不是遏制。爲了測試圍堵,使用BASH只[[ string == pattern ]]形式:

if [[ "$line" == *"downloads.php"* ]] 
+0

是的,就是這樣。在jordanm建議之後直接測試它。我只是永遠不知道爲什麼要在開始時添加「/ bin/bash」,腳本運行時沒有問題。如果在1個月前發現這個問題,將會爲我節省很多麻煩。感謝大家提供的及時幫助 – Chris

相關問題