ZSH -- 전체 경로 이름 없이 디렉토리로 CD를 넣습니다.

ZSH -- 전체 경로 이름 없이 디렉토리로 CD를 넣습니다.

https://stackoverflow.com/questions/25802017/bash-shell-search-for-subfolder-in-current-dir-and-cd-into-it

나는 원하지 않기 때문에 이것을 달성하고 싶습니다 tabcomplete.

명령을 입력하면 다음과 같습니다.

cd `find . -name test -type d`

다음 오류가 발생합니다.

find: ./usr/sbin/authserver: Permission denied

fzf와 ranger로 cd'ing을 시도했습니다. 하지만 다 엉망이에요.

또한 오류가 발생하는 이유는 폴더가 숨겨져 있는데 표시되는 폴더에서도 작동하지 않기 때문이라고 생각합니다.

답변1

이 오류는 find디렉터리에 대한 읽기 또는 입력 권한이 없기 때문에 디렉터리에서 파일을 찾을 수 없음을 나타냅니다.

저것

cd `find . -name test -type d`

find어쨌든 구문은 잘못되었습니다. 출력을 개행 문자 $IFS뿐만 아니라 모든 문자로 분할하고(파일 경로에 개행 문자가 포함되는 것을 방지할 수 있는 방법은 없음) 결국 여러 인수를 cd.

zsh에서는 다음을 수행하는 것이 좋습니다.

cd ./**/test(/[1])

숨겨진 하위 디렉터리는 무시하고 cd이름이 있는 하위 디렉터리의 모든 수준 아래에 있는 첫 번째(알파벳순) 디렉터리로 이동 합니다 .test

Glob 확장은 디렉토리 트리를 크롤링할 때 오류를 무시하지만 zsh에서는 $ERRNO쉘에서 마지막으로 실패한 시스템 호출의 오류 번호 값을 보유하는 특수 변수를 사용하여 오류를 확인할 수 있습니다.

어쨌든, sudo cd귀하의 의견에서 언급한 대로 하는 것은 의미가 없습니다. cd쉘 프로세스의 작업 디렉토리를 변경하는 데 사용되는 쉘 내장 명령입니다. sudo다른 사용자(마녀 ser)로 명령을 실행하는 데 사용되는 외부 명령입니다 .sudocd일부 시스템에는 별도의 유틸리티 가 있습니다.(POSIX에서도 필요함) 그러나 수행하는 작업은 자체 프로세스의 현재 디렉터리를 변경한 다음 해당 프로세스를 종료하는 것뿐이므로 현재 셸 프로세스의 현재 작업 디렉터리를 변경하는 데 도움이 되지 않습니다.

zsh유효한 사용자 ID 변경에 대한 지원이 내장되어 있지만 여전히 시스템에서 설정한 제한 내에 있습니다. 예를 들어, zsh실행 중인 프로세스는 root유효 uid를 무엇이든 변경하고 다시 루트로 돌아갈 수 있습니다.

# id -un
root
# EUID=1000
$ id -un
chazelas
$ EUID=0
# id -un
root

$UID그러나 or (uid, gid 및 기타 gid도 설정함)을 설정한 $USERNAME후에는 그렇지 않습니다 .

이론적으로는 프로세스의 현재 작업 디렉터리를 액세스할 수 없는 일부 디렉터리로 변경하기 위해 setuid 도우미(예:)를 통해 특수 파일 설명자 전달 메커니즘을 사용할 수 있어야 sudo하지만 잘 모르겠습니다. 이것을 지원하는 모든 쉘. 어쨌든 일단 거기에 도착하면 cd거기에 있는 파일로 아무 것도 할 수 없으므로 아무런 도움도 되지 않습니다.

$ cd /var/spool/cron/crontabs
cd: permission denied: /var/spool/cron/crontabs
$ sudo zsh
/home/chazelas# cd /var/spool/cron/crontabs
/var/spool/cron/crontabs# USERNAME=chazelas
/var/spool/cron/crontabs$

이제 /var/spool/cron/crontabs현재 작업 디렉토리가 제한된 디렉토리인 권한 없는 쉘이 있습니다.

/var/spool/cron/crontabs$ pwd
/var/spool/cron/crontabs
/var/spool/cron/crontabs$ ls
ls: cannot open directory '.': Permission denied

제한된 디렉토리의 셸에서 작업을 수행해야 하는 경우 해당 디렉토리에 대한 액세스 권한이 있는 사용자로 셸을 시작할 수 있습니다. 예를 들어:

sudo sh -c 'cd /restricted/dir && do-something-there'

이 명령의 일부 구현은 명령을 실행하기 전에 디렉터리에 도달 env할 수도 있으므로 셸을 호출할 필요가 없습니다.chdir()

sudo env -C /restricted/dir do-something-there

sudo(위에서는 (일반적으로) 기본 대상 사용자에게 root액세스 권한이 있다고 가정합니다. /restricted/dir-u옵션을 사용하여 사용자를 지정합니다.

관련 정보