명령이 .zshrc 내에서 예상 값을 반환하지 않습니다.

명령이 .zshrc 내에서 예상 값을 반환하지 않습니다.

다음을 실행해 보세요.

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이 반환됩니다.

관련 정보