2016-07-11 72 views
0

我運行以下腳本,在水珠的環路擴展到一個非常大的文件集。由於某些原因,由於按鍵拒絕退出......腳本打印出「檢測到按鍵,退出」但只是繼續前進。Cygwin的慶典拒絕退出

我懷疑有子shell被莫名其妙地產生了被吸乾退出通話,但我難倒就如何解決它。腳本根本不會退出。

#!/bin/sh -e 
bindir=`dirname $0` 

shopt -s nullglob 

dir="$1" 

diecygwin= 
for complete in "${dir}"/*#complete; do 
    if [ ! -z "$diecygwin" ]; then 
     exit "$diecygwin" 
     continue 
    fi 
    seq=${complete//#complete/} 
    echo -n "${seq} ... " 
    rc=0 
    $bindir/other.sh -d "$seq" || rc=$? 
    if [ $rc -eq 0 ]; then 
     echo ok 
     read -t 0.5 -n 1 -s holder && key="$holder" 
     if [ ! -z "$key" ]; then 
      echo detected keypress, exiting 
      exit 0 
      diecygwin=0 
     fi 
    elif [ $rc -ne 100 ]; then 
     echo fatal error $rc 
     exit 1 
     diecygwin=1 
    fi 
done 

回答

1

剛擡起頭,你不使用bash,您正在使用shsh缺少bash所具有的一些功能。這可能會造成麻煩。改變你的朋友到#!/bin/bash#!/usr/bin/env bash。在一些操作系統上,/ bin/sh指向/ bin/bash,但是這個改變了一陣子。欲瞭解更多信息閱讀Difference between sh and bash

如果孩子的將不會退出,您可以通過

kill -- -$PGID默認的信號殺死所有兒童和grandchildrens(TERM = 15)

kill -9 -$PGID SIGKILL(9)

您可以從同一進程樹的任何進程ID(PID)中檢索PGID kill -- -$(ps -o pgid= $PID | grep -o '[0-9]*')(信號TERM)

kill -9 -$(ps -o pgid= $PID | grep -o '[0-9]*')(信號KILL)

我還通過https://www.shellcheck.net/運行腳本,並返回以下:

Line 2: 
bindir=`dirname $0` 
     ^-- SC2006: Use $(..) instead of legacy `..`. 
       ^-- SC2086: Double quote to prevent globbing and word splitting. 

Line 4: 
shopt -s nullglob 
^-- SC2039: In POSIX sh, 'shopt' is undefined. 

Line 14: 
    seq=${complete//#complete/} 
     ^-- SC2039: In POSIX sh, string replacement is undefined. 

Line 15: 
    echo -n "${seq} ... " 
     ^-- SC2039: In POSIX sh, echo flags are undefined. 

Line 17: 
    $bindir/other.sh -d "$seq" || rc=$? 
    ^-- SC2086: Double quote to prevent globbing and word splitting. 

Line 20: 
     read -t 0.5 -n 1 -s holder && key="$holder" 
     ^-- SC2162: read without -r will mangle backslashes. 
      ^-- SC2039: In POSIX sh, read -t is undefined. 

編輯

if [ ! -z "$diecygwin" ]; then 
     exit "$diecygwin" 
     continue 
fi 

爲什麼continue在那裏?它什麼都不會做。該腳本將在到達之前終止。

的情況也是如此diecygwin=0

if [ ! -z "$key" ]; then 
    echo detected keypress, exiting 
    exit 0 
    diecygwin=0 
fi 

確定腳本繼續運行?它應該在退出時終止。如果它沒有通過出口後獲得什麼產出?

+0

/bin/sh的是/斌/ bash-它的cygwin的。繼續和diecygwin在那裏,因爲出口不退出。 – CoderBrien

+0

該腳本產生後退出的輸出是什麼? – Zuzzuc

+0

它保持循環,diecygwin沒有設置,但它跳過了一堆文件。 cygwin的錯誤? – CoderBrien