2011-11-12 2 views
2

$ BASH_COMMAND를 사용하여 현재 실행중인 명령을 검색하는 스크립트를 작성했습니다. 이 스크립트는 기본적으로 각 tmux 세션에 대해 열려있는 현재 명령과 파일을 파악하기위한 몇 가지 논리를 수행합니다. 사용자가 파이프 된 명령 (예 : cat file | less)을 실행하는 경우를 제외하고는 모두 효과적입니다.이 경우 $ BASH_COMMAND 만 파이프 앞에 첫 번째 명령을 저장하는 것으로 보입니다. 결과적으로 명령을 less[file] (파일이 열려있는 실제 프로그램)으로 표시하는 대신 cat[file]으로 출력합니다.파이프를 포함한 마지막 bash 명령 받기

한 가지 대안으로 $ BASH_COMMAND 대신 history 1을 사용하고 있습니다. 이 대안에도 몇 가지 문제가 있습니다. 먼저 $ BASH_COMMAND와 같은 별칭을 자동 확장하지 않습니다. 어떤 경우에는 스크립트가 혼란을 야기 할 수 있습니다 (예 : ls을 무시한다고 말하면 ll (ls -l에 매핑 됨) 대신 스크립트 명령을 무시하고 어쨌든 처리합니다.) 각 별칭에 대한 추가 조건문을 포함하면 깨끗한 해결책처럼 보이지 않습니다. 두 번째 문제는 HISTIGNORE를 사용하여 몇 가지 일반적인 명령을 필터링하는 것입니다.이 명령은 스크립트에서 인식하고 싶습니다. 기록을 사용하면 스크립트가 기록에 의해 추적되지 않으면 마지막 명령을 무시하게됩니다.

${#PIPESTATUS[@]} 또한 배열 길이가 1 (파이프 없음) 이상 (파이프를 사용하는 경우, 대신 히스토리를 검색 할 수 있음)인지 확인하려고 시도했지만 항상 1 명령 만 인식합니다 잘.

나에게 맞는 다른 대안을 아는 사람이 있습니까 (예 : 현재 하위 호출이 완료된 후에 실행될 다른 하위 호출에 대해 $ BASH_COMMAND를 저장하는 다른 변수 또는 파이프가 마지막 명령에서 사용 되었습니까?)

+4

하나의 nitpick :'less (1)'은 실제로 파일을 열지 않습니다. 'cat (1)'않습니다. 'less (1)'은 익명 파이프의 내용을 엽니 다. 파이프는'pipe (2)'로 만들어졌습니다. – sarnold

+0

이것은 낯설지 않은 아이디어입니다. 쉘에서 제대로 구현할 수 있을지 의심 스럽습니다. 'lsof'를 해봤습니까? –

답변

0

나는 약간의 구현을 변경하고 작동하도록 "history"명령을 사용해야한다고 생각한다. 또한 "alias"명령을 사용하여 구성된 별칭을 모두 확인합니다. "which"명령이 실제로 PATH 디렉토리에 저장되어 있는지 확인합니다. 행운을 빌어 요