&&
является условным оператором. Он выполнит команду справа, если и только если команда слева успешно завершилась. Поскольку вы выполняете команду слева в фоновом режиме, ее код возврата не может быть определен, и все ломается и не работает должным образом.
Не используйте &
. Вы должны либо выполнить command1 & command2 & command3
, либо ( command1; command2; command3 )&
. Второй будет выполнять все команды последовательно в подоболочке, которая выполняется в фоновом режиме.
Есть как минимум две причины сделать ./ что-то
.
У вас есть программа, которую вы хотите запустить. Его неудобно назвать чем-то вроде «тест», «кот» или «пс». Обычно оболочки ищут имена программ в каталогах в переменной среды PATH
. Чтобы выполнить свой тест
, вы должны ввести ./ test
, иначе / usr / bin / test
или что-то подобное будет выполнено. Это может сбивать с толку.
У вас нет .
в вашей переменной окружения PATH
, потому что вы не хотите случайно запустить программу, пока вы копаетесь в файловой системе. Действительно ужасные люди могли оставить скрипт ls
в каком-нибудь каталоге. Файл ls
может содержать rm -rf $ HOME
. Если ваш PATH
содержит "." в нужном месте этот ужасный человек может обманом заставить вас удалить все в вашем домашнем каталоге. Конечно, можно поставить "." как последняя запись в PATH
, но можно придумать обстоятельства, где "." в ПУТЬ
вызывает проблемы. Итак, чтобы запустить программу, исполняемый файл которой находится в текущем рабочем каталоге, вы должны добавить к имени файла префикс «./».
./
действительно всегда является текущим рабочим каталогом. Однако он (по уважительной причине) обычно не добавляется в PATH
. Это означает, что если у вас есть скрипт или двоичный файл в вашем текущем рабочем каталоге, который вы хотите запустить, вам нужно использовать ./ script.sh
, а не script.sh
, чтобы он бег.
vagrant@host:~$ pwd
/home/vagrant
vagrant@host:~$ mkdir foobar
vagrant@host:~$ mkdir foobar/~
vagrant@host:~$ cd foobar
vagrant@host:~/foobar$ cd ./~
vagrant@host:~/foobar/~$ pwd
/home/vagrant/foobar/~
vagrant@host:~/foobar/~$ cd ~
vagrant@host:~$ pwd
/home/vagrant
vagrant@host:~$ cd foobar
vagrant@host:~/foobar$ cd ~
vagrant@host:~$ pwd
/home/vagrant
vagrant@host:~$
Как отметили @DopeGhoti @Wildcard и другие, иногда полезно очень точно указать, в каком каталоге вы находитесь и в каком ваша цель. Конструкции ./
и ../
обеспечивают это.