?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
logical A ? B : C
nyaload
_winnie
Насколько я понимаю, в shell нельзя выразить if A ; then B ; else C ; fi через операции &&, ||, ! так, чтобы сохранить побочные эффекты. Простое доказательство не вижу, но если перебирать разные варианты "что слева и справа от корневой операции", то видно что какую-то команду придётся выполнить дважды.
Пара неработающих примеров:
(A && B) || C — когда A=true B=false C=true то return code выражения целиком это true, хотя хочется false.
(A && B) || (! A && C) — A может вызываться дважды

update: если добавить команду exit, то возможно:
( A && { B || exit 1 ; } || C )
Круглые скобки порождают подпроцесс, exit выходит из него. Фигурные скобки - только для для группировки выражения, как обычные скобки в математике. && приоритетней ||, так же как умножение приоритетней сложения. Ну и стандартная unix-путаница "1 это false, 0 это true".
Tags: ,

  • 1

Можно так вывернуться (не на шелле, а вообще), если результат не булев


(((a && (b*2+1)) || (c*2+1))-1)/2.


На шелле тоже можно, но формула будет громоздче.


В общем, никакой базис двуместных операций над булем не позволит, равно как и над другим конечным типом, а если тип данных операндов хоть на единичку меньше домена, то можно.
Для булей - хотя бы троичная логика. Для счётных и более - сделать ноль особой точкой легче лёгкого.


Зачем shell использовать?

Я вот у себя дома и на работе использую python. И мои скрипты одинаково работают под Windows/Linux/Mac OS X.


1) сильно выразительней, когда надо работать с файлами, процессами
Попробуй на питоне записать

( A file.* || B ) | xargs -P 3 C

где A, B, C какие-то запускаемые файлы

2) поиск по однострочникам - это поиск по history на горячей клавише, нет переключения между поиском по файлам, IDE для редактирования файлов, запуском скриптов с параметрами - это всё единая командная строка.


Edited at 2015-03-04 11:15 am (UTC)

Есть IPython для удобной строки с подсказками и историей.
http://ipython.org/ipython-doc/dev/interactive/tutorial.html#system-shell-commands

Я постоянно пользуюсь ipython в качестве продвинутого калькулятора, или в качестве интерактивного интерфеса к python-модулю, но я не умею там писать и редактировать не-однострочники. А однострочники в питоне умеют очень мало.

Так весь смысл того линка что я прислал - что можно запускать шелл-команды напрямую из ipython. Вот ещё примеры: http://ipython.org/ipython-doc/dev/interactive/shell.html

Слово "однострочники" опять пролетело мимо? :)

Прикольно, работает.

In [41]: !! seq 1 10 | while read N; do date --date="$N days ago"; done
Out[41]:
['Sat Mar 7 17:30:24 MSK 2015',
'Fri Mar 6 17:30:24 MSK 2015',
'Thu Mar 5 17:30:24 MSK 2015',
'Wed Mar 4 17:30:24 MSK 2015',
'Tue Mar 3 17:30:24 MSK 2015',
'Mon Mar 2 17:30:24 MSK 2015',
'Sun Mar 1 17:30:24 MSK 2015',
'Sat Feb 28 17:30:24 MSK 2015',
'Fri Feb 27 17:30:24 MSK 2015',
'Thu Feb 26 17:30:24 MSK 2015']



Только правила ескейпинга кавычек надо изучать заново

ipython:
In [46]: !! seq 1 10 | xargs -n 1 bash -c 'echo $0'
Out[46]: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']

bash:
seq 1 10 | xargs -n 1 bash -c 'echo $0'
1
2
3
4
5
6
7
8
9
10




интересное, работает ли это:
( A || ( C && 0 ) ) && B




( C && 0 ) потеряет то, что вернулось из C

  • 1