Как использовать переменную PATH в качестве отправной точки в find внутри zsh

Я пытаюсь использовать $PATH в качестве входных данных для поиска, чтобы найти файлы, определенные моим путем. Это моя попытка:

find ${PATH//:/ } -iname "*chrome*"

Здесь я заменяю все : в PATH с пробелом, поэтому список начальных точек выглядит как при вводе вручную. Проблема в том, что это ответ:

find: ‘/home/martin/bin /home/martin/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin’: No such file or directory

Переменная интерпретируется как целая строка, а не как несколько разделенных пробелами путей.

Эта конкретная проблема может быть решена с помощью xargs следующим образом:

echo $PATH | xargs -d: -Ix find x -iname "*chrome*"

Мне все еще любопытно, как заставить работать первую попытку. Могу поспорить, что один лучше по производительности тоже. Я использую Zsh в моей системе. Спасибо

1 ответ

Решение

Похоже, вы используете оболочку типа zsh, которая отключает разбиение слов при раскрытии переменных. Если вы действительно используете zsh, то вам нужно форсировать расширение, либо эмулируя sh (emulate sh) или используя ${=PATH//:/ }:

$ printf "%s\n" ${PATH//:/ }
/usr/local/sbin /usr/local/bin /usr/bin
$ printf "%s\n" ${=PATH//:/ }
/usr/local/sbin
/usr/local/bin
/usr/bin
$ (emulate sh; printf "%s\n" ${PATH//:/ })
/usr/local/sbin
/usr/local/bin
/usr/bin

Если вы действительно используете bash, проверьте ваш IFS:

$ (IFS=; printf "%s\n" ${PATH//:/ })
/usr/local/sbin /usr/local/bin /usr/bin
$ (IFS=; unset IFS; printf "%s\n" ${PATH//:/ })
/usr/local/sbin
/usr/local/bin
/usr/bin

настройка IFS в пустую строку отключает разделение слов в bash. Вы можете сбросить IFS чтобы получить значение по умолчанию и снова включить разделение слов.

Другие вопросы по тегам