Как использовать переменную 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
чтобы получить значение по умолчанию и снова включить разделение слов.