2015-08-01 2 views
0

Illustrated в этой консоли сессииMinimal Bash скрипт не работает должным образом без ./

[email protected]:~$ echo $PATH 
.../home/bir/bin:...   # script folder is in PATH 
[email protected]:~$ ls -lh ~/bin/  # script permissions look ok 
... 
-rwxr-xr-x 1 bir bir 28 Jul 31 21:46 test 
... 
[email protected]:~$ test    # no output 
[email protected]:~$ ~/bin/test 
startend      # anticipated output 
[email protected]:~$ cd ~/bin/ 
[email protected]:~/bin$ ./test 
startend      # anticipated output 
[email protected]:~/bin$ cat test  
#!/bin/sh 
echo "start$1end" 

Также:

[email protected]:~$ which test 
/home/bir/bin/test 
[email protected]:~$ whereis test 
test: /usr/bin/test /usr/bin/X11/test /usr/share/man/man1/test.1.gz 

(И я должен добавить что-то здесь, потому что мой пост в основном код.)

+0

Можете ли вы показать весь '$ PATH'? – hek2mgl

ответ

2

Обычно есть тест в/usr/bin/test, который будет впереди одного в вашем домашнем каталоге на вашем пути. Вы можете понять это, введя команду which test

EDIT: Как Alok Singhal указывает на комментарии ниже, test также одна из команд, встроенных в Баш оболочку (и некоторых других оболочек), и если вы используете bash, то еще одна встроенная команда оболочки, type, может показать вам, что будет выполнен не только то, что test будет выполнено (даже если это встроенная оболочка и недоступна в файловой системе), но и все версии теста он скрывается. Например, если у меня есть/дом/погладить/бен впереди/USR/BIN:

$ type -a test 
test is a shell builtin 
test is /home/pat/bin/test 
test is /usr/bin/test 

Итак, набрав type -a <cmdname> очень полезно, чтобы выяснить, не только то, что будет выполняться, но и то, что будет не. Показывая полные пути, он также позволяет использовать вырезание и вставку (в большинстве программ терминалов) для выбора и выполнения правильной программы, даже если вы решите не переименовывать ее. (Другие раковины также имеют аналогичные устройства с псевдонимом.)

В качестве альтернативы, man type не даст вам никакой полезной информации о команде bash shell , потому что это не отдельная программа. man bash действительно описывает это, так как он встроен в оболочку bash, но в этом документе много использования буквального слова «type», поэтому самое быстрое прокручивание донизу, если вы ищете информацию о type команда.

EDIT2: Как указывает hek2mgl, команда hash также полезна, если у вас возникли проблемы с выполнением вашей команды. В частности, если вы создали программу, которая имеет то же имя, что-то другое, и вы уже запустить что-то еще, ваш сценарий может не работать, даже если это первый в пути:

$ python 
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
$ echo echo Hi there! > bin/python 
$ chmod 700 bin/python 
$ python 
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
$ hash -r # Clear the hash for this instance of bash 
$ python 
Hi there! 
$ rm bin/python 
$ python 
bash: /home/pat/bin/python: No such file or directory 
$ hash -r 
$ python 
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
+0

Я добавил «hash -d test», но я не уверен, потому что тест является встроенным. – hek2mgl

+2

Кроме того, 'test' - это оболочка, встроенная в' bash' ('type -a test'), поэтому даже если' ~/bin' была первой записью, она может не сработать. Это, как правило, плохая идея назвать тестовую программу 'test' в Unix, к сожалению! –

+0

@AlokSinghal Действительно, хотел упомянуть об этом именно в этот момент! :) – hek2mgl

Смежные вопросы