LINUX.ORG.RU

Bash команда test отказывается работать по ману

 ,


0

1

имеется:

--> cat upup.sh 
if [ ( pgrep chromium 1>/dev/null ) ] 
then
echo 'open'
else
echo 'close'
fi
выдает ошибку
--> ./upup.sh  
./upup.sh: строка 1: синтаксическая ошибка рядом с неожиданным маркером «pgrep»
./upup.sh: строка 1: `if [ ( pgrep chromium 1>/dev/null ) ] '

в мане сказано:

SYNOPSIS

test EXPRESSION 
test

[ EXPRESSION ] 
[ ] 
[ OPTION  

DESCRIPTION

Exit with the status determined by EXPRESSION.

--help
display this help and exit
--version
output version information and exit
An omitted EXPRESSION defaults to false. Otherwise, EXPRESSION is true or false and sets exit status. It is one of:

( EXPRESSION )
EXPRESSION is true

мануал или баш сутулится???

★★

хмммм... мне стыдна... но в мане об ентом ни слова... надо

pgrep chromium 1>/dev/null

просто взять в кавычки вместо скобок... почему в мане написано чо в скобках??? где ошибка то?

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

так он выведет процессы а не выдаст код возврата

да и енто декларация значения переменной.

а в мане указано ( выражение )

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

так я то уже понял, тока кавычки нужны, так вроде не роббит без них, смсл поста в чем траббла — в мане неправда, или баг баша?

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

1. [ - bash built-in, test - coreutils (разные маны)

2. Надо понимать, что в каждом конкретном случае в доке означает expression.

3. ./upup.sh без шибэнга будет вызывать не баш.

смсл поста в чем траббла

Сложно сказать - может гены, может плохое воспитание, недостаток йода.

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

он проверяет условность... если код возврата 0, то условие выполнено и значит значение истина...

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

1. [ - bash built-in, test - coreutils (разные маны)

ага, только описание одно и тоже... тоже в скобках expression...

2. Надо понимать, что в каждом конкретном случае в доке означает expression.

ну я так понимаю тут означает выражение, возвращающее логическое значение... pgrep chromium полностью отвечает ентим требованиям

3. ./upup.sh без шибэнга будет вызывать не баш.

тут да, не дописал, с дописанными #! /bin/bash все равно та же песня.

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

нет не отвечает, надо так

да чо ты гришь то... так команде test предоставится список процессов, а не код возврата.

при чем я не грю чо енто работать не будет, скорее будет ибо строка не пустая, но енто не правильно.

при чем выше написал уже подобному ответу

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

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

Тебе вряд ли стоит понимать, стоит достать голову из жопы и прочитать правильные маны, а именно man [ и следом man bash, секция CONDITIONAL EXPRESSIONS.

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

он проверяет условность... если код возврата 0

Этим занимается if, а не test.
if проверяет код возврата от test или любой другой утилиты.

test проверяет все что угодно, только не код возврата.

surefire ★★★
()

Код возврата же, можно получить ${?}

garik_keghen ★★★★★
()

Тред не читал

pgrep something && echo Found || echo Not found
Опции сам подбери.
Вместо pgrep можно вообще взять pidof

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

так он выведет процессы а не выдаст код возврата

А вообще пофик, результат будет один и тот же. Ты как будто запустить даже не пытался.

Bfgeshka ★★★★★
()

У тебя ошибка не в test, а в том, что ты написал внутри квадратных скобок. Попробуй заменить test (квадратные скобки) на что-то другое, например, echo.
Сообщение об ошибке полностью валидное.

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

1. [ - bash built-in, test - coreutils (разные маны)

Нет.

3. ./upup.sh без шибэнга будет вызывать не баш.

Неизвестно. Но в общем случае — да.

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

Расскажи что-нибудь ещё о себе.

man test| tail -n1

и да, я понимаю, что type test: test is a shell built-in.

3. ./upup.sh без шибэнга будет вызывать не баш.

Неизвестно.

Даже вызванный таким образом bash (симлинком) будет пытаться прикидываться не башем.

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

я понимаю, что type test: test is a shell built-in.

И зачем тогда пишете неправду?

Даже вызванный таким образом bash (симлинком)

Каким еще симлинком? Программа без хэшбанга исполняется текущей оболочкой.

будет пытаться прикидываться не башем

Да нет, вроде бы.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier
       If  bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of
       sh as closely as possible, while conforming to the POSIX standard as well.

Каким еще симлинком? Программа без хэшбанга исполняется текущей оболочкой.

Нет.

 ~ % print $SHELL
/bin/zsh
 ~ % cat > /tmp/test
foreach doc (*.pdf) ls $doc; end               
 ~ % chmod +x /tmp/test
 ~ % /tmp/test
/tmp/test: 1: /tmp/test: Syntax error: "(" unexpected

anonymous
()
Ответ на: комментарий от aedeph_

ТС в ОПе цитирует man test, который, внезапно, отличается от man [.

А, понял. Не знаю, что у вас за поставка, но дело в том, что в Дебиане это не так — здесь [(1) — это ссылка на test(1).

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

При том, что твоё утверждение ложно.

Вы неправы.

$ cat test
echo "$BASH_VERSION"
echo "$POSIXLY_CORRECT"
$ bash foo
4.4.11(1)-release

$ ./foo
4.4.11(1)-release

Скриптоговно без шебанга выполняется /bin/sh.

Как видите, нет.

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

мануал или баш сутулится???

Сутулится safocl. pgrep chromium 1>/dev/null *не* expression. Кури ман дальше.

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

Нет, ты. В втором случае у тебя просто наследуется переменная.

 ~ % sh          
$ echo $POSIXLY_CORRECT

Почитай манулы, разберись со своим примером.

Как видите, нет.

В моём примере видно, в твоём — нет :)

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

Проверил в bash на несовместимой конструкции с «[[» — bash в очередной раз доказал свою невменяемость, выполняя код в файле (видно с set -x). Zsh ведёт себя более разумно, и пытается выполнить код с помощью /bin/sh: синтаксическая ошибка и никаких признаков source в трейсе, в отличие от.

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

Да уже понял, что шелл сам решает, см. выше. Мне более вменяемым видится вариант с передачей /bin/sh потому что результат более предсказуемый.

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

Логично. Вот авторы fish, похоже, думали лучше прочих:

 ~ >> echo "echo OK" > /tmp/test
 ~ >> chmod +x /tmp/test
 ~ >> /tmp/test 
Failed to execute process '/tmp/test'. Reason:
exec: Exec format error
The file '/tmp/test' is marked as an executable but could not be run by the operating system.
anonymous
()
Ответ на: комментарий от anonymous

Хай дальше пилят, без возможности посорсить /etc/profile и отправлять свои же функции в bg его всё равно серьёзно воспринимать невозможно.

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

в мане теста написано:

( EXPRESSION )
EXPRESSION is true
енто ничо не говорит о том чо он проверяет истинность выражения??? оО

safocl ★★
() автор топика
Ответ на: Тред не читал от zolden

у тебя же третье условие выполнится только тогда када второе ложно, а оно ложно не может быть, ибо оно ехо текст

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

именна... енто одно и тоже, только для удобочитаемости ставятся [] вместо слова test

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

А дальше в мане написано:

It is one of:

И дальше перечисляются эти самые EXPRESSION. Например

 -e FILE
              FILE exists

Т.е будет: [ -e /dev/brain ], которое вернет таки 1.

Deleted
()
Ответ на: комментарий от aedeph_

а именно man [

Oo

--> man [
Нет справочной страницы для [

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

да я в англ не силен, по ентому такие мелочи пропускаю...

вижу тока команда - значение параметров и т.д.

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

Нет, ты. Во втором случае у тебя просто наследуется переменная.

Неконструктивно действуете — пытаетесь гадать, вместо того, чтоб разобраться. BASH_VERSION не в окружении.

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