PATH и $PWD

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

PATH и $PWD

Сообщение SLEDopit »

В ходе некоторых экспериментов обнаружил такую штуку:
Если задать PATH="$PATH:\$PWD/bin" и в текщущей директории создать директорию bin, а в ней исполняемый файл test.sh, то автодополнение отлично дополняет команду до test.sh, однако при нажатии enter возникает ошибка
-bash: test.sh: command not found.
Если же $PWD/bin заменить на ./bin , то все прекрасно работает.

Код: Выделить всё

 $ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:$PWD/bin

 $ ls -l bin/test.sh
-rwxr-xr-x 1 user user 19 Jul 28 16:26 bin/test.sh

 $ act bin/test.sh
-bash: act: command not found

 $ ^ac^ca
cat bin/test.sh
#!/bin/bash
echo 1

 $ test
test         test_chmLib  test.sh

 $ test.sh
-bash: test.sh: command not found

 $ PATH="/usr/local/bin:/usr/bin:/bin:/usr/games:./bin"

 $ test
test         test_chmLib  test.sh

 $ test.sh
1


Никак не могу разобраться, почему так происходит. Ведь $PWD определена.

ps. все это чудо происходит в bash.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: PATH и $PWD

Сообщение /dev/random »

SLEDopit писал(а):
28.07.2011 16:44
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:$PWD/bin

Вы вставили в переменную сам текст "$PWD"??? Содержимое переменной $PATH (как и почти всех других переменных) используется "как есть", без дальнейшей обработки. Ваш вариант будет искать в текущем каталоге подкаталог с именем "$PWD" (дословно, но без кавычек).
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: PATH и $PWD

Сообщение sgfault »

/dev/random писал(а):
28.07.2011 17:05
Ваш вариант будет искать в текущем каталоге подкаталог с именем "$PWD" (дословно, но без кавычек).

Удивительно, но у меня оно работает точно также. Т.е., как будто автодополнение подставляет значения переменных.

Код: Выделить всё

sgf@shilvana:~/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
sgf@shilvana:~/tmp$ ls -l bin/test.sh
-rwx------ 1 sgf sgf 25 Jul 28 17:01 bin/test.sh
sgf@shilvana:~/tmp$ test
test       testrb     testrb1.8

Попробуем произвольную последовательность

Код: Выделить всё

sgf@shilvana:~/tmp$ PATH="$PATH:12345/bin"
sgf@shilvana:~/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:12345/bin
sgf@shilvana:~/tmp$ test
test       testrb     testrb1.8
sgf@shilvana:~/tmp$ PATH="${PATH%:12345/bin}"

не работает. Теперь PWD без '$'

Код: Выделить всё

sgf@shilvana:~/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
sgf@shilvana:~/tmp$ PATH="$PATH:PWD/bin"
sgf@shilvana:~/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:PWD/bin
sgf@shilvana:~/tmp$ test
test       testrb     testrb1.8
sgf@shilvana:~/tmp$ PATH="${PATH%:PWD/bin}"

тоже не работает. Теперь произвольную переменную

Код: Выделить всё

sgf@shilvana:~/tmp$ PATH="$PATH:\$ABC/bin"
sgf@shilvana:~/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:$ABC/bin
sgf@shilvana:~/tmp$ test
test       testrb     testrb1.8
sgf@shilvana:~/tmp$ PATH="${PATH%:\$ABC/bin}"

тоже не работает. И, наконец, PWD с '$'

Код: Выделить всё

sgf@shilvana:~/tmp$ PATH="$PATH:\$PWD/bin"
sgf@shilvana:~/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:$PWD/bin
sgf@shilvana:~/tmp$ test
test       test.sh    testrb     testrb1.8
sgf@shilvana:~/tmp$ test.sh
bash: test.sh: command not found

и все выглядит так, как будто автодополнение "пропускает" значение PATH через eval. Что бы это могло значить.. :unsure:
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: PATH и $PWD

Сообщение SLEDopit »

/dev/random
Вы вставили в переменную сам текст "$PWD"??? Содержимое переменной $PATH (как и почти всех других переменных) используется "как есть", без дальнейшей обработки. Ваш вариант будет искать в текущем каталоге подкаталог с именем "$PWD" (дословно, но без кавычек).
У меня не возникало вопросов, если бы именно так и было. Однако директории \$PWD/bin не существует, а в автодополнении подставляется именно файл лежащий в ./bin. Однако, при нажатии на enter файл не исполняется, а вываливается ошибка. Собственно поэтому вопрос и возник.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: PATH и $PWD

Сообщение /dev/random »

SLEDopit писал(а):
29.07.2011 00:19
Однако директории \$PWD/bin не существует, а в автодополнении подставляется именно файл лежащий в ./bin.

Значит, баг автодополнения.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: PATH и $PWD

Сообщение ZyX »

/dev/random писал(а):
29.07.2011 07:13
SLEDopit писал(а):
29.07.2011 00:19
Однако директории \$PWD/bin не существует, а в автодополнении подставляется именно файл лежащий в ./bin.

Значит, баг автодополнения.

Ага. В zsh такого не происходит, в bash-4.1_p9 — то же, что и выше.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: PATH и $PWD

Сообщение drBatty »

/dev/random писал(а):
29.07.2011 07:13
Значит, баг автодополнения.

ИМХО фича.
если написать $HOME/dir, то автодополнение само раскрывает $HOME, чем $PATH хуже?
но запускает сам bash, и он не раскрывает (в КС раскрывает, а в $PATH нет).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: PATH и $PWD

Сообщение /dev/random »

drBatty писал(а):
31.07.2011 08:42
ИМХО фича.
если написать $HOME/dir, то автодополнение само раскрывает $HOME, чем $PATH хуже?
но запускает сам bash, и он не раскрывает (в КС раскрывает, а в $PATH нет).

Ничем не хуже. Если в значение $HOME включить знак $, то этот знак будет восприниматься дословно. Точно так же и в $PATH.
Переменные должны раскрываться только в самой командной строке, без рекурсии.
Спасибо сказали: