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オプションを使用してユーザーを指定します。

おすすめ記事