2015-11-23 31 views
1

我試圖運行下面的腳本,讓我們從比它的工作目錄以外的其他位置調用它foo.sh試圖運行來自不同位置的shell腳本,但錯誤說我試圖創建一個目錄

var1="$1" 
var2="$2" 

for SNR_NR in $var1; do 
    for parts in $var2; do 
     # echo *-$SNR_NR-$parts 
     for file in *-$SNR_NR-$parts; do 
     cat "$file" | sed -n '3p' \ 
        | sed 's/$/,/' >> tmp 
     cat "$file" | sed -n '4p' \ 
        | tr ' ' ',' \ 
        | sed 's/^.\(.*\).$/\1/' >> tmp 
     done 
    done 
    # Concatenate the above onto one line 
    paste -d " " - - < tmp 
    rm tmp 
done 

它很簡單,它從工作目錄運行得非常好,因爲它使用兩個數字整數參數。

現在,如果我嘗試從比工作目錄之外的其他地方運行它,我得到的錯誤是:

/data/RESULTS/foo.sh: 18: /data/RESULTS/foo.sh: cannot create tmp: Is a directory 
cat: *-0-500: No such file or directory 
/data/RESULTS/foo.sh: 22: /data/RESULTS/foo.sh: cannot create tmp: Is a directory 
cat: *-0-500: No such file or directory 
paste: -: Is a directory 
paste: -: Is a directory 
rm: cannot remove ‘tmp’: Is a directory 

我曾嘗試加入我的工作目錄到$PATH,但它仍然無法正常工作。運行ls -la on foo.sh給出-rw-------但是做chmod +x foo.sh仍然不起作用。

最奇怪的部分是,它試圖創建一個名爲tmp的目錄,我不太明白,因爲它只是一個臨時文件來存儲一些中間結果,然後將其打印到shell。

編輯:

將船上的建議,從意見後,以下現在生產這個錯誤,而不是,這是一種進步:

var1="$1" 
var2="$2" 

for SNR_NR in $var1; do 
    for parts in $var2; do 
     # echo *-$SNR_NR-$parts 
     for file in *-$SNR_NR-$parts; do 
     cat "$file" | sed -n '3p' \ 
        | sed 's/$/,/' >> brian 
     cat "$file" | sed -n '4p' \ 
        | tr ' ' ',' \ 
        | sed 's/^.\(.*\).$/\1/' >> brian 
     done 
    done 
    # Concatenate the above onto one line 
    paste -d " " - - < brian 
    rm brian 
done 

sh foo.sh 5 500運行結果

cat: *-0-500: No such file or directory 
cat: *-0-500: No such file or directory 

SOLUTION:

一個簡單的重寫產生

var1="$1" 
var2="$2" 
# Supply results/script directory as argument 
var3 = "$3" 

# cd into script directory before running it 
cd $var3 

for SNR_NR in $var1; do 
    for parts in $var2; do 
     # echo *-$SNR_NR-$parts 
     for file in *-$SNR_NR-$parts; do 
     cat "$file" | sed -n '3p' \ 
        | sed 's/$/,/' >> brian 
     cat "$file" | sed -n '4p' \ 
        | tr ' ' ',' \ 
        | sed 's/^.\(.*\).$/\1/' >> brian 
     done 
    done 
    # Concatenate the above onto one line 
    paste -d " " - - < brian 
    rm brian 
done 
+1

這是可怕的。整個內部循環應該是一個單獨的'sed'腳本;像'sed -n'3s/$ /,/ p; !4D; y//,/; S/^ \ $/\ 1/P。(* \。)。 q'「$ file」'除了註釋。 – tripleee

+0

對,原始文件有四行,我想要最後兩行。在它們的原始版本中,它們看起來像'-97669.26212165842 \ n (0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)',我希望它們在一個像這樣的'-97669。26212165842,0,0,0,0,0,0,..,0,0'。 (0 0 0 ... 0 0 0)的每一行都有1000個條目,但爲了演示,我添加了「...」。無論如何,你的腳本不起作用; 'sed:-e表達式#1,字符12:未知命令:4'' – Astrid

+1

對不起,應該是'4!d'而不是'!4d'。主要的一點是,當人們輕易做到的時候,使用六個流程是相當浪費的。 'sed'並不是特別容易閱讀(或者寫,呵呵),但是你的任務聽起來像是Awk的簡單單線程。 – tripleee

回答

3

不,它試圖創建一個文件tmptmp已經在該位置的目錄。

這就是爲什麼> tmp< tmprm tmp全部失敗,is a directory錯誤,因爲沒有人可以對目錄進行操作。

如果您想要一個安全的臨時文件,請使用mktemp

+0

我不太關注。在運行腳本之前,工作目錄中沒有名爲'tmp'的目錄。但是,如果像你說的那樣,如果我從工作目錄運行它,它是如何工作的? – Astrid

+0

@Astrid:恕我直言,它應該在任何不包含'tmp'子文件夾的目錄中工作,這意味着至少既不是'/'也不是'/ var' –

+1

這個錯誤非常清楚地表明工作目錄** **已經有一個'tmp'目錄。腳本的工作目錄是shell/etc的工作目錄。它運行它而不是腳本的目錄(除非你在腳本中改變它)。將'pwd'或'echo $ PWD'添加到腳本和'ls'或'ls tmp'中,看看你是否能得到你所期望的。 –

1

您已擁有一個名爲'tmp'的目錄,因此無法創建具有該名稱的文件。你可以在你的腳本開始這樣做趕上這樣的情況:

if [[ -d tmp ]] 
then 
    echo I can not execute this script, because a directory named tmp exists 
    ls -ld tmp 
    exit 1 
fi 

當然tmp的是不是反正臨時文件最好的名字....

+0

Ohhhh ......我明白了,這對我來說並不明顯,謝謝。現在我改變了這個臨時文件的名稱:'cat:* -0-500:沒有這樣的文件或目錄 cat:* -0-500:沒有這樣的文件或目錄' – Astrid

+0

我猜這裏沒有匹配模式的文件* - $ SNR_NR- $部分。 – user1934428

+0

順便說一句:如果你使用zsh而不是bash,你可以在內部for循環中的文件模式中添加一個修飾符,如果模式不匹配,會導致內部循環被跳過。我不知道bash的(新版本)是否有這樣的功能。 – user1934428

相關問題