2012-09-10 5 views
0

명령 줄 플래그 (옵션)가 GNU getopt에 의해 자동으로 수행되도록 명령 줄 인수 앞에 놓 이도록 명령을 변경하려고합니다.Bash : 실행 전에 명령을 바꿀 수 있습니까?

Mac은 BSD getopt를 사용하여 기능이 부족합니다. 하나의 명령을 실행할 때 플래그와 구문을 구문 분석하는 스크립트를 실행하여 순서를 변경하고 재정렬 된 명령을 실행하도록 bash를 조정하고 싶습니다. 이런 식으로

, 모두

ls -lh /tmp 
ls /tmp -lh 

내 맥의 터미널에서 작동합니다.

+0

3 개 이상의 옵션 'cp -R/root/bkp'의 경우에 어떤 종류의 순서가 바뀌는가를 가정하십시오. 예 : – triclosan

+1

이제 제가 nk에 대해, 당신은 당신의 Mac에서 coreutils macport http://www.macports.org/ports.php?by=name&substr=coreutils (그리고 아마 다른 것들)를 통해 많은 GNU 도구를 얻을 수 있다는 것을 알고 있습니까? 어쩌면 이것이 당신의 노력에서 당신을 도울 수 있습니다. – Mat

+0

@Mat, 나는 그들을 대체하는 것이 지루하고 위험하다고 생각한다. 게다가 BSD getopt에 의존하는 다른 실행 파일에서는 작동하지 않습니다. 재주문을 수행하고 bash를 호출하는 셸을 만드는 것을 고려하고있었습니다. – luanjunyi

답변

2

getopt() 함수에 대한 인수가 각 명령에 대해 어떤 모양인지 알지 못하는 경우 명령 줄에서 인수를 재정렬하는 작업을 수행하는 일반 용도의 도구를 안전하게 작성할 수 없습니다. 고려 : 첫 번째 명령에서

make something -f makefile 
cp something -f makefile 

을, 명령 호출을 정규화하기 위해 전면에 -fmakefile 모두를 이동해야합니다. 두 번째 단계에서는 -f 만 이동해야합니다. 다음 파일 이름도 이동하면 명령을 다시 쓰고 데이터를 삭제합니다.

물론 --force 또는 --file=makefile 스타일 인수도 긴 형식을 취하는 경우 getopt_long() 인수 문자열이 무엇인지 알아야합니다.

솔직히, Linux 환경에서 POSIXLY_CORRECT를 사용하는 것이 더 좋으며, 제공되는 교활한 유연성에 대해 잊어 버리고 인수 전에 항상 옵션을 작성하는 방법을 배우십시오. 그렇게하면 모든 유닉스 계열 컴퓨터에서 코드가 더 잘 작동 할 것입니다.


당신은 /bin/usr/bin (예 /usr/gnu/bin 이외의 디렉토리에 GNU 소프트웨어를 설치 한 다음 앞서 시스템 디렉토리를 PATH에 /usr/gnu/bin를 배치하는 것이 확인 할 수있다. fink 같은 사전 구축 된 시스템이 있습니다, 너무. 그러나 GNU의 아날로그가없는 툴의 경우에는 도움이되지 않을 것이고, 작성한 쉘 스크립트는 사용자가하는 것과 같은 설정이없는 다른 Mac에서는 사용할 수 없다는 '위험'이 있습니다.