Відсоток у змінній середовища $ PATH


16

Мій $ PATH виглядає так:

/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

У баші, я можу без проблем викликати паличку, розташовану в

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

подобається

$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed"  -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template

Однак у режимі сумісності оболонки Bour паличку неможливо знайти:

$ wand
sh: 2: wand: not found

Схоже, проблема полягає у знаку% у цих шляхах. Цей знак був доданий кодуванням URL-адреси, тому ім'я "GNU / Linux" може використовуватися в імені каталогу, навіть якщо це неправдиве ім'я файлу. Чи можна отримати ім'я, що працює в sh, або змусити команду sh працювати як bash. Тобто, змусити bash поводитись так само, хоча він був викликаний командою / bin / sh, яка в будь-якому випадку посилається на баш.


Приємне запитання. Схоже , що символ% правильно не працює в $ PATH з sh(це нормально в bashі zshхоча). Безпосереднє виклик виконуваного файлу sh; дійсно дивно.
Рмано

Що станеться, якщо ви використовуєте 2 %%?
mikeserv

Або втекти від%?
mdpc

Відповіді:


15

Це не оболонка Bourne, або bashемуляція оболонки Bourne, це оболонка Almquist, у вашому випадку, ймовірно, оболонка Almquist Debian (вилка Linux від Debian з BSDs на основі оригінальної оболонки Almquist).

У оболонці Almquist (оригінал та сучасна версія) %використовується PATHдодаткові функції, характерні для ash. Цитування з документації:

Шлях пошуку

Розташовуючи команду, оболонка спочатку розглядає, чи має вона функцію оболонки за цим іменем. Потім, якщо PATH не містить записи для %builtin, він шукає вбудовану команду під цим ім'ям. Нарешті, він шукає кожен запис у PATH по черзі для команди.

Значення змінної PATH повинно становити серію записів, розділених двокрапками. Кожен запис складається з імені каталогу або імені каталогу, за яким слід прапор, що починається зі знаку відсотка. Поточний каталог повинен бути вказаний порожнім ім'ям каталогу. Якщо знак відсотка відсутній, то запис змушує оболонку шукати команду у вказаному каталозі. Якщо прапор є, %builtin тоді здійснюється пошук списку вбудованих команд оболонок. Якщо прапор є, %func то в каталозі шукається файл, який читається як вхід до оболонки. Цей файл повинен визначати функцію, ім'я якої - назва команди, яку шукають.

Імена команд, що містять косу рису, просто виконуються без виконання будь-якого з перерахованих вище пошукових запитів.

Інші оболонки люблять kshабо zshмають подібний механізм автоматичного завантаження функцій, але вони використовують іншу змінну ( $FPATH), але ви не можете визначити, яка з функцій або виконуваних файлів має перевагу.

У вашому випадку /home/torbjorr/deployed/vector/x86_64-GNU%2fLinuxінтерпретується як /home/torbjorr/deployed/vector/x86_64-GNUкаталог із 2fLinuxпрапором. Цей прапор ігнорується, як і невідомо.

Навколо цього немає способу. Навіть якщо попіл був механізм виходу , так що це %не розглядатиметься спеціально, він би потім не працювати в інших оболонках або інші речі , які виглядають вгору $PATHяк execvp().

Вам потрібно буде видалити %символи $PATH, тому перейменуйте каталог або додайте символьне посилання.

Або не використовувати ashдля своїх /bin/sh. Інші легкі реалізації POSIX оболонки , які не роблять , які включають yashі mksh.


Хоча ця відповідь дає пояснення, вона не дає рішення. Чи є сумісний спосіб збереження%.
user877329

@ user877329, тут немає реального рішення. Дивіться мою редакцію.
Стефан Шазелас

3
Іншими словами, Debian shпорушує стандарт POSIX. Зважаючи на те, що справа в shтому, що ви маєте окремий, полягає саме в тому, що ви повинні бути впевнені в тому, щоб не переходити через якесь несумісне розширення оболонки (я думаю, сьогодні ніхто не використовує /bin/shяк оболонку входу), я вважаю, що це помилка.
celtschk

1
@celtschk, погодився, хоча питання використання ashдля / bin / sh більше уникнути покарання за ефективність використання bash, тому використання yashабо mksh(або poshякщо ви хочете виключити всі розширення) все-таки кращий варіант, ніж використання bash. Крім того, можна вважати це кутовим випадком. Ніхто зазвичай не %має компонента шляху. Більшість снарядів мають кутові корпуси, коли вони не відповідають стандартам POSIX.
Стефан Шазелас

1
@mtmiller, це не те, як я читав значення набору символів портативного файлу (PFCS). POSIX вказує API програмування, але не реалізацію файлової системи. PFCS - це мінімальні гарантії POSIX, які працюватимуть незалежно від файлової системи, незалежно від поточної локалі, але це не є приводом для того, щоб інструмент не приймав символ у імені файлу, якщо він підтримується файловою системою та дійсний у поточному локалі. Зауважте, що, наприклад, для POSIX потрібна [команда, навіть якщо цього символу немає в PFCS.
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.