나는 원하지 않기 때문에 이것을 달성하고 싶습니다 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)로 명령을 실행하는 데 사용되는 외부 명령입니다 .s
u
do
cd
일부 시스템에는 별도의 유틸리티 가 있습니다.(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
옵션을 사용하여 사용자를 지정합니다.