2016-08-11 2 views
0

나는 Unix/Linux 셸 스크립트 초보자이며 아래 줄이 포함 된 스크립트를 살펴야합니다. 이 질문의 다음 세부 사항은 모호하지만이 코드를 작성한 사람은 문서를 남기지 않으므로 그 내용을 모면했다. 아무도 그들이 실제로하는 것을 조언 할 수 있습니까?유닉스/리눅스의 이러한 기능은 무엇을합니까?

두 가지 특정 코드가 있습니다. 다양한 매개 변수를 대표하는

failure="020o 040a" 
success="002[a-d] 003[a-r] 004[a-s] 005[a-u] 

, 내 생각, 쉘 스크립트가 수행하는 계산 함께 할 수있는 : 첫 번째는 단순히 polys.sh는 내용으로 텍스트 파일입니다 라인 source polys.sh이다. 계산의 본질은 스크립트의 실행을 목표로하기 때문에 중요하지 않습니다.

두 번째 코드는 아래와 같으며 관련 줄은 StartStop 개의 주석으로 구분됩니다. 내가 말할 수있는 것 : $arg1이 비어 있습니다. $opt1도 공백입니다. $poly은 텍스트 파일의 경로와 이름이고 나는 ./search입니다. 나는 폴더라고 생각합니다.

if [ $search == "yes" ] 
    then 
     # Search stage for squares containing zeros 
     # 

     # Start. 

     output="$outputs/search/"`basename $poly` 
     ./search $opt1 $arg1 < $poly 2>&1 | tee $output 
     if tail -n1 $output | grep -v "success" 

     # End. 

     then 
     echo "SEARCH FAILURE" >> $output 
     continue 
     fi 
     # Save approximations 
     # 
     echo -n "SEARCH SUCCESS " >> $output 
     cat /tmp/iters >> $output 
     cp /tmp/zeros $inputs/search/`basename $poly` 
    else 
     echo "No search" 
    fi 
+0

를 포함 그들의 의도는 명백합니다 (앞서 말한 버그는 그렇지 않을 수도 있음). –

+0

http://shellcheck.net에서 보여주는 모든 버그를 수정하고 남은 것만에 초점을 맞춘 질문을하고 이미 이해하고있는 모든 것을 제거하십시오. –

+0

(http://shellcheck.net/에서도 찾을 수없는 문제가 있으며, POSIX 사양에서'[] '에 대해서만''='이 유효하다는 보장을하지 않는다고 불평하지 않습니다. ='문자열 비교 연산자로서, 에코에 대한 POSIX 스펙에 명시 적으로 정의되지 않은 동작 인'echo -n'을 설명하지 않고 명시 적 형식 문자열을 기본 대체로 사용하는'printf'와 함께하지만, 않습니다 * 식별 시작하는 것이 좋습니다). –

답변

1

편집 찰스 더피에 의해 권고로 초기 면책 조항 :

아래의 설명은 당신이 확장 관련 버그를 공격하지 않습니다 가정; 이러한 설명은 (따라서 단지

  • source polys.sh 그것을 소싱 파일과 같은 폴더에있는 파일입니다 스크립트 polys.sh,의 코드를 포함 올바른지 확신 할 수 shellcheck.net에 의해 권고로 코드를 수정하시기 바랍니다 파일 이름, 경로 없음). 해당 파일 내에서
  • :

    failure="020o 040a" 
    success="002[a-d] 003[a-r] 004[a-s] 005[a-u]" 
    

    두 변수 선언이다; 변수 $failure"020o 040a"$success에서 "002[a-d] 003[a-r] 004[a-s] 005[a-u]"으로 설정됩니다. 파일이 source d이므로이 두 변수를 스크립트에서 사용할 수 있습니다 (자신을 보려면 echo "$failure"echo "$success"을 수행하십시오).

  • output="$outputs/search/`basename $poly`"

    설명하는 두 부분 :.
    "$outputs/search/" 
    

    문자열 "/search/" 의해 첨부 된 변수 $outputs의 값으로, 즉, "$outputs/search/"하는 변수 $output 설정

    ,

    `basename $poly` 
    

    역 추적 (Backticks)의 명령은 명령 대체를 말하며 명령을 해석하고 실행하여 결과를 반환하며 basename $poly 명령은 기본 파일을 가져 오거나 폴더 이름이 $poly에서 파일 경로 인 경우 (예 : poly="/dev/file.txt"의 경우 basename $poly, 결과는 file.txt). 출력은 문자열로 추가됩니다. "$outputs/search/".

    ./search $opt1 $arg1 < $poly 2>&1 
    

    실행 파일 ./search을 두 개의 인수, $opt1$opt2 변수 (./는 현재 스크립트의 디렉토리 속기)를 실행합니다 :

  • ./search $opt1 $arg1 < $poly 2>&1 | tee $output

    파이프 |에 의해 분리 된 두 개의 명령입니다. $poly은 파일 경로를 나타내는 변수 이름이며 파일 경로의 내용은 명령에 리디렉션됩니다 (< 사용). 모든 오류 출력 (stderr, 2)은 표준 출력 (stdout 또는 &2)으로 리디렉션됩니다 (앰퍼샌드는 파일 경로가 아니라 파일 설명 자임을 나타냅니다. 그렇지 않으면 출력을 2이라는 파일로 리디렉션합니다)). stdinstdout 및 파일 경로와 같은 인자에

    tee $output 
    

tee 파이프 출력. 따라서 tee "/home/nick/output"stdin"/home/nick/output"stdout의 파일로 저장합니다.

if tail -n1 $output | grep -v "success"

tail -n1 $output 

  • 은 "$ 출력"변수의 값으로 파일의 마지막 줄을 가져옵니다. 마지막 줄 "fail" 경우 그렇지 않은 같은 라인 (에 "success"tail -n1에서 마지막 줄에 비 일치

    grep -v "success" 
    

    검색 (-v 경기를 반전) 예, 그것은 if 문을 통과 할 것 의도 *와 * 시간과 텍스트의 꽤 걸릴 것 버그를 모두 설명하고, 어디의 많은 부분이있다 -이 코드 조각에서 많은 버그가 실제로있다 "success")

+0

파일 이름이 제정신이 아니고 (공백 문자 나 glob 문자를 포함하지 않음), IFS가 기본값으로 설정되어 있다는 점에 관해서는 많은 가정이 있습니다. 즉,이 코드가 작성자가 의도 한 바를 묘사하고 있습니다. 실제로 실행될 때 * 보장 *합니다. –

+0

@CharlesDuffy 이것은 코드와 명령에 대한 설명이며 품질에 대한 설명이 아닙니다. –

+0

물론 가능한 행동을 제외하면 실제로 설명이 될까요? "This does X"는 코드가 실제로 X를 수행 할 것이라는 사실 만 전적으로 진술 한 것입니다. –

관련 문제