$ 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를 저장하는 다른 변수 또는 파이프가 마지막 명령에서 사용 되었습니까?)
하나의 nitpick :'less (1)'은 실제로 파일을 열지 않습니다. 'cat (1)'않습니다. 'less (1)'은 익명 파이프의 내용을 엽니 다. 파이프는'pipe (2)'로 만들어졌습니다. – sarnold
이것은 낯설지 않은 아이디어입니다. 쉘에서 제대로 구현할 수 있을지 의심 스럽습니다. 'lsof'를 해봤습니까? –