쉘에 대해 아무것도 모르면서 어떤 쉘 특정 코드가 속하는지 어떻게 알 수 있습니까?

쉘에 대해 아무것도 모르면서 어떤 쉘 특정 코드가 속하는지 어떻게 알 수 있습니까?

bash이 코드는 쉘용 이라는 것을 알고 있습니다.

for f in $file.docked.[0-9][0-9][0-9]
do
  mv $f $f.pdb
done

이 코드는 tcsh쉘용 입니다.

foreach f ( file.docked.[0-9][0-9][0-9] )
  mv $f $f.pdb
end

참고자료를 읽어보니 이렇게 이해가 되었습니다. 학습자로서 두 코드를 모두 bash. 작성된 Linux 셸 유형에 관계없이 확장을 통해 코드가 모든 셸에서 실행되도록 하는 방법이 있습니까?

답변1

for f in $file.docked.[0-9][0-9][0-9]
do
mv $f $f.pdb
done

csh은 및 Bourne 제품군의 모든 셸(ash, bash, zsh, ksh, zsh, mksh, yash...) tcsh에서 구문적으로 유효한 코드이지만 zsh유용한 작업을 수행할 가능성이 가장 높습니다.

이 코드의 목적이 현재 디렉토리의 파일 이름에 쉘 변수의 내용으로 시작하고 3개의 ASCII 10진수로 끝나는 접미사를 추가하는 것이라면 .pdb에서 다음이 필요합니다.$file.docked.bash

shopt -s failglob
for f in "$file".docked.[0123456789][0123456789][0123456789]
do
mv -- "$f" "$f.pdb"
done

( --쉘에 관계없이 필요)bash

  • Korn 셸에서와 마찬가지로 매개변수 확장을 인용해야 합니다. 그렇지 않으면 분할+glob을 거치게 됩니다.
  • [0-9]일반적으로 0123456789보다 더 많은 문자와 일치하며 그 목록은 로케일 및 시스템에 따라 다릅니다. 0123456789만 [0123456789]일치 하면 됩니다 bash(아니요,최신 버전 옵션이 globasciiranges도움이 되지 않습니다).
  • 일치하지 않으면 glob이 확장되지 않으므로 일치하는 파일이 없으면 루프에 $f포함을 통해 전달 됩니다. (csh 또는 zsh와 유사한 동작을 얻기 위해) 또는 (복사된 옵션에서) 문제를 해결합니다.contents-of-file-variable.docked.[0-9][0-9][0-9]failglobnullglobzsh
foreach f ( file.docked.[0-9][0-9][0-9] )
  mv $f $f.pdb
end

구문 처럼 보이지만 다시 구문 csh입니다 zsh. 해야 (t)csh한다:

foreach f ( file.docked.[0-9][0-9][0-9] )
  mv -- $f:q $f:q.pdb
end

(이 특별한 경우에는 :q다른 예와 달리 s가 반드시 필요한 것은 아니지만 파일 이름에 SPC, TAB, LF 또는 와일드카드 문자가 포함되지 않음이 보장됩니다.)

완전히 다른 언어로 동일한 작업을 수행하는 유효한 코드를 작성하는 것은 매우 까다롭습니다. 일반적으로다국어코딩. 이것Code Golf stackex 자매 사이트에는 전용 섹션이 있습니다.. 하지만 이것은 일반적으로 하고 싶은 일이 아닙니다.

바라보다이 웹 사이트의 예이를 달성하는 데 필요한 길이의 예입니다.

관련 정보