Добавление &
порождает фоновый процесс.
Если вы напишите a; b
, он запустит команду a
, дождется ее завершения, а затем запустит команду b
по порядку.
Если вы напишите a & b
, он появится a
как фоновый процесс. Он не будет ждать его завершения и b
сразу же начнет работать . Он будет работать одновременно.
Вы можете увидеть, что он делает, экспериментируя в оболочке. Если вы X
установили, xterm
это хороший способ увидеть, что происходит: набрав
$ xterm
вызовет открытие другого окна терминала, а первое будет ждать, пока вы его не закроете. Только когда вы закроете его, вы вернете свою оболочку. Если вы печатаете
$ xterm &
затем он запустит его в фоновом режиме, и вы немедленно вернете свою оболочку, в то время как xterm
окно также останется открытым.
Так что если вы напишите
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
он устанавливает соединение, отправляет строку, сохраняет то, что выходит в файл, и только затем переходит к следующему.
Добавление &
делает это не ждать. В итоге все десять тысяч из них будут работать более или менее одновременно.
Ваш сценарий, кажется, «заканчивается» быстрее, потому что он, вероятно, не закончился в то время. Он только что сделал десять тысяч фоновых заданий, а затем закончил первый.
Это также означает, что в вашем случае он попытается открыть более десяти тысяч соединений более или менее одновременно. В зависимости от того, что другой конец может обработать, некоторые из них вполне могут потерпеть неудачу. Мало того, но нет никакой гарантии, что они будут работать по порядку, на самом деле они почти наверняка не будут работать, так что на самом деле все останется /tmp/me/dump.txt
в догадках.
Вы проверили, был ли вывод правильным?
&
заставляет команду работать в фоновом режиме, вот и все. Это не сделало это быстрее или что-нибудь. Прочитайте любую оболочку, которую вы используете (я полагаю, Bash) руководство.