LINUX.ORG.RU

Несколько вопросов по bash

 


1

4

1) почему

( echo $$; )
и
{ echo $$; }
выводят один и тот же PID?

2) зачем нужен шебанг, если и без него скрипты работают?

3) что есть башизм? всмысле где посмотреть список всех башизмов?

4) когда использовать < <(), а когда пайп? понятно, что удобнее пайп. emulek говорил, что пайп порождает лишний процесс, и что в скриптах использует < <() заместо пайпов. Есть ещё в чём-то разница, кроме лишнего процесса?

★★★★★

Последнее исправление: teod0r (всего исправлений: 2)

1) почему ( echo $$; ) и { echo $$; } выводят один и тот же PID?

Потому что переменная раскрывается на одном и том же этапе — самом первом, субоболочка стартует позже.

2) зачем нужен шебанг, если и без него скрипты работают?

Скрипты без хешбанга (очевидно любые, не только на Баше) пытаются быть исполненными оболочкой пользователя по-умолчанию — а даже на ГНУ она совершенно не обязана быть Башем, я уж не говорю за другие системы.

3) что есть башизм? всмысле где посмотреть список всех башизмов?

Синтаксическая конструкция языка ГНУ Баш. В мане по Башу же.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Синтаксическая конструкция языка ГНУ Баш. В мане по Башу же.

я имел ввиду то, чего нет в других интерпретаторах, например в zsh. например, вроде бы, &> — башизм

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

В каком смысле, «в других» и «например»?

Дифференциальный список синтаксисических конструкций Баша с каким-либо одним реальным (с Борн шеллом, с Корн шеллом, с Дашем, или с упомянутым вами Zsh) или воображаемым (ПОЗИКС 2-1997, ПОЗИКС 1-2001, ПОЗИКС 1-2004, ПОЗИКС 1-2008) языком безусловно можно составить, хотя авторитетного источника тут быть не может — лучше уж сами возьмите и сопоставьте, то зачем сравнивать один с [всеми] другими?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

зачем сравнивать один с [всеми] другими?

часто на ЛОРе в чей-то адрес критично пишут «башизм».
пишу скрипты, а вдруг они не заработают, например, на zsh...

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

часто на ЛОРе в чей-то адрес критично пишут «башизм».

Чего только не пишут на ЛОРе.

пишу скрипты, а вдруг они не заработают, например, на zsh...

Вот пишете вы программу на Си++, и вдруг подумали — а вдруг она не соберется компилятором Си. Не абсурд, не?

Вы же не зря, наверное, про хешбанги спрашивали.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Потому что переменная раскрывается на одном и том же этапе — самом первом, субоболочка стартует позже.

4.2
Попробуй с eval и заэкранированной подстановкой - ничего не изменится.
man bash (Special parameters):

       $      Expands to the process ID of  the  shell.   In  a  ()  subshell,  it          
              expands to the process ID of the current shell, not the subshell.             
На самом деле это прописано в POSIX и выполняется всеми оболочками, претендующими на posix-совместимость.
Узнать реальный PID в bash можно из переменной BASHPID, в других оболочках - read PID Tail < /proc/self/stat , естественно только на системах с поддерживаемой и смонтированной procfs.

ABW ★★★★★
()
Ответ на: комментарий от Zmicier

Хотя нет, извините, teod0r, — проверил сейчас — это я наврал, — оно не от преждевременного раскрытия, это by design.

$

($$) Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the invoking shell, not the subshell.

https://www.gnu.org/software/bash/manual/bash.html#Special-Parameters

Если хотите запросить PID подоболочки, используйте ( echo $BASHPID; ).

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

пишу скрипты, а вдруг они не заработают, например, на zsh...

Вот пишете вы программу на Си++, и вдруг подумали — а вдруг она не соберется компилятором Си. Не абсурд, не?

Понимаешь, в случае с C/C++ у кода расширение разное, соответственно .c и .cpp. А в случае со скриптом, во-первых, можно без расширения его оставить, либо .sh назвать - попробуй угадай, какой интерпретатор имелся в виду, если шебанга нет. А в случае с шебангом можно и #!/bin/sh написать, и на разных системах это будет разный шелл - где-то bash, где-то dash, и так далее.

tiandrey ★★★★★
()

#man bash или #bash --help

piwww ★★★★
()

когда использовать <()(Process Substitution), а когда пайп?

<() -- когда нужно подставить вывод внешнего процесса туда, где по синтаксису требуется путь к файлу. Оно заменяется на путь типа /dev/fd/число и используется, чтобы не городить временные файлы. Пайп -- когда нужен пайп. (Простите.) Остаток абзаца не читал.

d_a ★★★★★
()
Ответ на: комментарий от teod0r

Греп хоть как умеет, но есть программы, которым не всё равно, и которые умеют только пути к файлам. Например, diff. Там придётся <(), чтобы сравнить выводы процессов.

d_a ★★★★★
()
Ответ на: комментарий от teod0r

Нет, совсем не то же.

Вот эти уже ближе:

grep 1 < <(echo 1) и echo 1 | grep 1

А вот это совсем близко, разницу заметите только в интерактивной оболочке:

grep 1 < <(echo 1) и shopt -s lastpipe; echo 1 | grep 1

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Нет, совсем не то же.

ой, действительно. перепутал <( и < <(

teod0r ★★★★★
() автор топика
26 декабря 2015 г.

сделал бенчмарк | и < <() в цикле с 1000 повторов: пайп оказался быстрее

teod0r ★★★★★
() автор топика

зачем нужен шебанг, если и без него скрипты работают

Не везде

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.