![명령이 .zshrc 내에서 예상 값을 반환하지 않습니다.](https://linux55.com/image/135501/%EB%AA%85%EB%A0%B9%EC%9D%B4%20.zshrc%20%EB%82%B4%EC%97%90%EC%84%9C%20%EC%98%88%EC%83%81%20%EA%B0%92%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
다음을 실행해 보세요.
function which_terminal {
return (ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11)
}
다양한 터미널 에뮬레이터에 대해 다양한 테마를 구성할 수 있도록 터미널 에뮬레이터를 실행하는 .zshrc 내에서 변수를 가져옵니다.
명령줄에서 이것을 실행하면 정확히 어떤 에뮬레이터가 사용되고 있는지 알 수 있습니다. 하지만 파일에 추가하려고 하면 다음과 같은 오류가 발생합니다.
which_terminal:1: no matches found: (ps -p16632 | awk 'NR==2' | cut -d ' ' -f 11)
누군가가 도울 수 있다면 내가 어디로 잘못 가고 있는지 찾을 수 없습니다.
답변1
셸에서 함수의 반환 값은 명령의 종료 상태와 유사합니다. 성공(0) 또는 실패 코드(> 0)를 나타내는 작은 정수 값만 반환할 수 있습니다.
이 상태는 명령의 출력과 아무 관련이 없습니다. 명령을 실행하고 그 출력을 변수에 저장하려면 다음을 사용하십시오.명령 대체. 함수 내에서 명령을 실행하고 해당 출력을 함수의 출력으로 사용하려면 명령을 실행하기만 하면 됩니다.
function which_terminal {
ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11
}
구문 분석된 출력은 ps
신뢰할 수 없고 과도합니다. (또한 실수입니다. 'NR==2'
to awk
및 ' '
to 를 구문 분석하고 있는데 cut
둘 다 유효하지 않은 인수입니다. 각 인수 주위에 작은따옴표나 큰따옴표가 필요하며 둘 다 필요하지 않습니다.) 명령에는 ps
원하는 필드를 인쇄할 수 있는 옵션이 있습니다. 예를 들어 comm
실행 파일 이름(Linux에서는 16자로 잘림) 또는 args
인수가 포함된 전체 명령줄(호출 방법에 따라 명령의 전체 경로인 경우도 있음) 등이 있습니다 .
function which_terminal {
ps -p$PPID -o comm=
}
또는 출력을 변수에 저장합니다.
parent_process_command=$(ps -p$PPID -o comm=)
오류가 발생하는 이유는 zsh가 return
명령에 대한 인수로 다음에 나오는 내용을 구문 분석하려고 하기 때문입니다(여기서는 인수 키워드이지만 return
동일한 방식으로 구문 분석됩니다). 여는 괄호를 보고 그것이 와일드카드 표현식의 시작인지 판단합니다. 이 와일드카드 표현식은 ps -p16632
, awk 'NR==2'
또는 (여기에 렌더링되지 않은 선행/후행 공백 포함) 이라는 파일과 일치 cut -d -f 11
하지만 (놀랍지도 않게) 해당 이름을 가진 파일이 없기 때문에 zsh는 일치하는 항목을 찾지 못한다고 불평합니다. 현재 디렉터리에 있는 파일을 호출 return ?
했는데 3
단일 문자 이름을 가진 다른 파일이 없으면 3이 반환됩니다.