想要实现这个,因为我不想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
变量来检查错误,该变量保存 shell 进行的最后一次失败的系统调用的错误编号值。
无论如何,sudo cd
按照您在评论中提到的那样做是没有意义的。cd
是 shell 的内置命令,用于更改 shell 进程的工作目录。是一个外部命令,用于以不同用户 ( witch ser )sudo
身份运行命令。s
u
do
有些系统确实有一个独立的cd
实用程序(甚至 POSIX 也要求),但它所做的只是更改自己进程的当前目录,然后退出该进程,因此它不会帮助您更改当前 shell 进程的当前工作目录。
zsh
内置支持更改有效用户 ID,但仍在系统设置的限制内。例如,zsh
运行的进程root
可以将其有效 uid 更改为任何内容并再次返回 root:
# id -un
root
# EUID=1000
$ id -un
chazelas
$ EUID=0
# id -un
root
但在您设置$UID
or $USERNAME
(它还设置 uid、gid 和其他 gids)之后就不会了。
理论上,应该可以通过 setuid 帮助程序(例如sudo
)使用特殊的文件描述符传递机制将进程的当前工作目录更改为他们无权访问的某个目录,但我不知道有任何 shell 支持这种做法。而且无论如何,一旦你设法到达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$
我现在有一个非特权 shell /var/spool/cron/crontabs
,其当前工作目录为受限目录。
/var/spool/cron/crontabs$ pwd
/var/spool/cron/crontabs
/var/spool/cron/crontabs$ ls
ls: cannot open directory '.': Permission denied
如果您需要在受限目录中的 shell 中执行操作,您可能希望以有权访问该目录的用户身份启动 shell。例如:
sudo sh -c 'cd /restricted/dir && do-something-there'
该命令的某些实现env
还可以chdir()
在执行命令之前先到达某个目录,这样就不必调用 shell:
sudo env -C /restricted/dir do-something-there
sudo
(上面假设(通常)的默认目标用户root
有权访问/restricted/dir
,请使用该-u
选项来指定用户)。