Разверните подстановочные знаки в команде прежде, чем выполнить его

Существует запись в Вашем $PATH указывая на каталог, к которому Вы не можете получить доступ, и Вы используете версию мерзавца ранее, чем 1.7.10.1.

Когда Вы работаете git lg мерзавец сначала делает некоторую установку, включая добавление записи в копию $PATH то, что это использует. Затем это пытается выполнить команду git-lg, так, чтобы команда переопределила бы псевдоним. Когда это делает это, это добирается, разрешение отклонило ошибку, показанную в Вашем выводе.

Более старые версии мерзавца остановились бы в той точке. Начиная с версии 1.7.10.1, это будет рассматривать ту ошибку то же как команда просто не быть найденным.

Когда Вы выполнили это, поскольку корневой мерзавец смог просмотреть все каталоги в $PATH, посмотрите что нет git-lg команда существует, и таким образом, она продолжила бы использовать определенный псевдоним.

Для решения проблемы, можно обновить до более новой версии мерзавца. Другая опция состояла бы в том, чтобы удостовериться, что у Вас есть разрешение получить доступ ко всем каталогам, перечисленным в Вашем $PATH, или путем предоставления дополнительных разрешений на любом, которые являются проблемой или не включая разрешения в списке.

6
13.04.2015, 22:52
3 ответа

Это зависит от режима редактирования вашей оболочки. Например, я использую VI-режим и тип esc и и и подстановочные знаки будут расширены.

3
27.01.2020, 20:24

Как насчет

echo rm build/* tmp/*

или, в моей версии bash, нажав tab tab сразу после того, как wildcard даст мне список соответствующих файлов.

Для "аккуратного удаления файлов" я бы порекомендовал либо использовать флаг взаимодействия с rm, либо снова префиксовать с помощью echo

echo rm -i f*o
rm -i f*o

Правда, ни то, ни другое не даст вам список впереди, как вы предпочитаете.

7
27.01.2020, 20:24

На самом деле поведение выглядит следующим образом (как в «Learning the bash Shell» О'Рейли ).

  1. Esc\ завершит до самого длинного общего префикса, если есть более одного совпадения, или дополнит имя файла/каталога/..., если есть только одно совпадение (, добавив /если это каталог ).
  2. Esc*ведет себя аналогично, за исключением того, что он перечисляет все завершения, если их больше одного.
  3. Esc= повторяет то, что вы получили бы с помощью Esc*и возвращает то, что вы набрали, без изменений.

В качестве примера (я попробовал сам ), учитывая каталог, содержащий файлы

aaabbb  aaaccc  aaaddd
  1. ...$ vi aEsc\ выдаст ...$ vi aaa•и оставит вас в режиме вставки на .
  2. ...$ vi aEsc*выдаст ...$ vi aaabbb aaaccc aaaddd •и оставит вас в режиме вставки в (, насколько я пробовал, он не добавляет /, если это каталог ).
  3. ...$ vi aEsc= выведет aaabbb aaaccc aaadddи вернет вам ...$ vi a, оставив вас в командном режиме.

Понятно, что завершающий *в используемом вами регулярном выражении означает подразумеваемый ; ты мог бы написать

rm build/ tmp/

, а затем нажал Esc*на обоих(да, насколько я могу судить и попробовать, Esc*расширяет все подстановочные знаки только в пробеле -слово с разделителями, на котором стоит курсор).

Но если вы вставите один подстановочный знак, то последний больше не подразумевается, и вы должны указать его явно. В самом деле, если есть файл с именем aaazzzwww, то запись a*w, aaazzzw, a*z*или a*w*и нажатие Esc\ приведет к aaazzzwww, но a*zне стал бы!

0
27.01.2020, 20:24

Теги

Похожие вопросы