Похож на Ваш $PATH, пусто. Попробовать echo $PATH
, вывод должен быть подобен этому:
/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/root/bin
В противном случае необходимо проверить Ваш .bash_profile
или .bashrc
. Или если Вы используете su username
управляйте для переключения пользователей, необходимо использовать su - username
в следующий раз.
grep -R[1184653] может принимать несколько путей в командной строке, поэтому если вы уверены, что ни один из путей не содержит пробелов, вы можете заменить [1184654]$(grep -l -Re "$searchstring" "$filepath")[1184655] на [1184656]$(grep -l -R "$searchstring" $(cat path_list))[1184657].
Это будет неудачно, если любой из путей будет содержать пробелы, табуляции или глобус, но и оригинальный тоже.
Намного более надежный подход использует [1184658]find[1184659] и просто применяет sed ко всем файлам, доверяя ему не изменять файлы без совпадений (здесь предполагается, что оболочка [1184660]bash[1184661]):
Но это не дает вам никакой обратной связи о том, какие файлы он модифицирует.
Более длинная версия, которая дает Вам обратную связь:
Сначала я покажу, как она работает, потом объясню, как. Итак, я создам базу тестовых файлов:
которая создаст кучу файлов, каждый из которых будет назван под номером 1-10, который он содержит:
Это разделенный запятыми список файлов в моем тестовом каталоге, каждый из которых [1185317]? [1185318], представляющий собой новую строку.
Каждый файл содержит только один номер. Теперь я сделаю замену [1185319]grep[1185320]:
Теперь, когда я...
Все файлы
одинаково [1185323]ИЗМЕНЯЮТСЯ[1185324]. Это также работает рекурсивно. Хорошо, теперь я объясню, как.
Во-первых, думаю, функция:
начинается с [1185798]:n[1185799]ext label
\|[1185801]address[1185802]|[1185803] аргумент [1185804]$1[1185805] - маркер
, если текущая строка - [1185806]! [1185807] не совпадает [1185808] { добавляется к [1185928]H[1185929] старому буферу
b[1185939] ранчо обратно на [1185940]: n[1185941]ext label
}}
else if current line is [1185812]$[1185813]last line [1185814]l[1185815]ook at pattern space
else e[1185816]x[1185817]change of hold and pattern buffers and. ...
l[1185819]ook однозначно на шаблоне пространства
(Буква эл.) [1185823] Запишите пространство для образца на стандартный выходной сигнал в визуально однозначной форме. Символы, перечисленные в Базе Определения объема ИВЭЭ Стд 1003.1-2001, таблица 5-1, Побег Последовательности и связанные с ними действия [1185824]( '\\', '\a', '\b', '\f', '\r', '\t', '\v' )[1185825] записываются в виде соответствующей экранирующей последовательности; [1185826] '\n'[1185827]. в этой таблице неприменимо. Символы, не включенные в эту таблицу, не печатаются. таблица пишется в виде одного [1185828] трехзначного [1185829] восьмеричного числа (с указанием предшествующая [1185830]\[1185831]обратная косая черта) для каждого байта в символе (наиболее значительный Сначала байт). Длинные линии должны быть сложены, с точкой сгибания указывается путем написания [1185832]\[1185833]обратной косой черты, за которой следует [1185834]\n[1185835]ewline; длина при котором происходит складывание, не определено, но должно быть уместно, чтобы выходное устройство. Конец каждой строки должен быть отмечен знаком [1185836] "$" [1185837].
Так что если я сделаю:
Я не собираюсь делать тот же уровень детализации, но в основном следующее утверждение [1185353]sed[1185354]:
cd -- '--Recovery Files'
Если линия начинается с маркера [1185838]$1[1185839]. ...
cd -- '--Recovery Files'
Тянет в внешней линии [1185840]N[1185841]до тех пор, пока текущая линия не оканчивается на [1185842]$
Если нужно было сделать то же самое, то снимается обратный слеш [1185844]\[1185845]обратный слеш и [1185846]\n[1185847]символ оси в верхней строке.
Затем он удаляет обратный слеш [1185848]$
Ищет любые [1185854]'[1185855] одинарные кавычки и удваивает- заключает их в кавычки
Наконец, он окружает всю строку единственными кавычками [1185856]'[1185857]
Итак, теперь, когда я это сделаю:
Я понял:
Остальное вроде как легко. Это зависит от того, что строка [1185369]././[1185370] разрешится, но это произойдет только в выводе [1185371]find/grep[1185372] во главе каждого имени пути - так что это станет моим маркером [1185373]$1[1185374].
I [1185375]-exec grep[1185376] из [1185377] find[1185378] и укажите [1185379]-l[1185380] для него, чтобы он выводил имена файлов для тех файлов, которые содержат регекс.
Я затем [1185381]\[1185382]обратный слеш экранирует каждый символ в ее выходе для [1185383]xargs[1185384]. И с помощью [1185385] printf[1185386] я пишу сценарий к файлу [1185387] |pipe[1185388] - который я [1185389].dot[1185390] источник как [1185391]/dev/fd/0[1185392]. Я определяю переменную [1185393]f[1185394] как ее текущий аргумент - мое имя - и [1185395]cat[1185396], который [1185397]$f[1185398] аргумент к [1185399]<<[1185400]heredocument, который подается в [1185401]sed[1185402], и [1185403]sed[1185404] записывает обратно над исходным файлом. Это может включать в себя временные файлы - это зависит от вашей оболочки. [1185405] bash[1185406] и [1185407]zsh[1185408] выпишут временную папку на каждый наследственный документ - но они их тоже убирают. [1185409]тире [1185410], с другой стороны, просто напишут наследственный документ на анонимный [1185411]|pipe[1185412].
Но важно то, что файл должен быть полностью прочитан до его записи - так работают наследственные документы и подмена команд.[1184972].