LINUX.ORG.RU
решено ФорумAdmin

Как сгенерировать заданный код выхода (exit code) одной командой?

 , exit code, код ошибки


1

1

Мне нужно выполнить такую команду, которая бы возвратила заданный код возврата. Код возврата принимается из входного потока.

Пытаюсь сделать так:

> echo 32 | xargs exit
xargs: exit: Нет такого файла или каталога
Неожиданный сюрприз. Какого-то черта xargs не работает со встроенными командами шелла...

Как по-другому можно решить эту задачу?

Может быть, даже через inline perl / python или еще каким командным извратом.


Перемещено hobbit из general

★★★★★

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

Ответ на: комментарий от Radjah

Ну если рассматривать полный вариант, то мне нужно вернуть код возврата такой, который был у первой команды в команде.

Вот что имею в виду:

> exit 32 | tee /tmp/teeFile.txt ; echo ${PIPESTATUS[0]} | xargs exit

Вся эта конструкция должна вернуть error code равный 32. (Вместо «exit 32» на самом деле может быть любая команда со своем кодом выхода, «exit 32» только для наглядности).

Это я решаю проблему, что tee «сбивает» код возврата первой команды в полной команде.

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

Так что ли?

#!/bin

data_producer()
{
    echo "Превед медвед"
    echo "Превед izden"
    exit 32
}

mkfifo named_pipe
(cat named_pipe | tee tmp.log | xargs -d '\n' printf "=> %s\n") &
pid1=$!
(data_producer > named_pipe) &
pid2=$!

wait $pid1
wait $pid2
status=$?
rm named_pipe
exit $status
wandrien ★★
()
Ответ на: комментарий от Xintrea

У тебя в примере точно так же имеется скрипт, о чем говорит наличие символа |. То, что он в одну строчку записан, он не перестаёт быть скриптом sh от этого.

Без многострочного скрипта требуемый тебе результат не получить, потому что нужно делать отдельный wait $pid на ту часть конвейера, откуда нужен код возврата.

wandrien ★★
()

Пытаюсь сделать так:

echo 32 | xargs exit xargs: exit: Нет такого файла или каталога

Извращенец.

Какого-то черта xargs не работает со встроенными командами шелла…

Если бы ты хоть немного подумал, то сам бы понял. Не надо иметь семь пядей во лбу, чтобы понять, что встроенные команды шелла никто, кроме того шелла, в который они встроены, не понимает.

Наговнякать шельный скрипт с требуемой тебе функциональностью — раз плюнуть:

#!/bin/sh
read status
exit $status
debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 1)

echo $? покажет код возврата последней выполненной команды. Ничего никуда передавать не надо. Исполнил что-то и дрыгнул $? и всё, хош в пайп отправь, хошь куда =)

LINUX-ORG-RU ★★★★★
()
$ printf '%s' '32' | tee /dev/stderr | (exit $(cat))
32                                                                                        

Это ChatGPT подсказал, как один из нескольких вариантов. 😀 Стало интересно решение данной темы, и спросил его.

Если что, он предлагал и вариант схожий с Как сгенерировать заданный код выхода (exit code) одной командой? (комментарий).

p.s. Надеюсь, не буду подвергнут остракизму за сотрудничество с ИИ. )

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

Круто.

> echo 32 | (exit $(cat))
> echo $?
32
Интересно, откуда нейросетка это решение вытянула? В публичном поле я нечего похожего не нашел.

Кстати, «| tee /dev/stderr |» по сути лишнее, нет никакого смысла засовывать заданный код возврата в stderr, потому что завершающая команда его так и так заменит.

Но все равно круто, весь ЛОР пол дня не мог ничего внятного сказать.

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

echo 32 | (exit $(cat))

Это не команда - это фрагмент командной строки bash или sh, который отрабатывает только при вводе через соответствующий shell.

Команда - это к примеру:

bash -c 'read RC; exit $RC'

что и предлагал debugger.

Так что, нейронка вас обманула )

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

Какого-то черта xargs не работает со встроенными командами шелла…

Если бы ты хоть немного подумал, то сам бы понял. Не надо иметь семь пядей во лбу, чтобы понять, что встроенные команды шелла никто, кроме того шелла, в который они встроены, не понимает.

Это уродство привело к тому, что в Linux имеется две команды echo:

Особенность вывода на консоль через echo

И есть подозрение, что это потому, что дефолное действие в xargs - это как раз таки echo.

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