Ожидать использование команды в Linux?

Вот универсальная информация для обновления, debian основывал дистрибутив:

  1. Обновление /etc/apt/sources.list в репозиторий новой версии.
  2. apt-get update
  3. apt-get dist-upgrade

Необходимо провести независимое исследование о том, как обновить исходный файл (файлы). Я нашел это хотя:

deb http://packages.linuxmint.com/ maya main upstream import
deb http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ precise-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ precise partner
deb http://packages.medibuntu.org/ precise free non-free

#deb http://archive.getdeb.net/ubuntu precise-getdeb apps
#deb http://archive.getdeb.net/ubuntu precise-getdeb games
16
27.09.2013, 00:20
3 ответа

Проблема состоит в том, что Вы выходите wait в подоболочке:

if `wait $!`;then

Поскольку wait встроенное, не команда, она воздействует на подоболочку, не Вашу текущую оболочку.

Вывод, который Вы видели бы, но не:

wait: pid 12344 is not a child of this shell

... со статусом возврата 1.

Для выполнения теста, необходимо будет сделать это, не используя подоболочку.

#!/bin/bash
function back()
{
  sleep $1
  exit $2
}
back $1 $2 &
b=$!

wait $b && echo success || echo failure

Это дает результат, который Вы ожидаете, и ожидает, пока Вы ожидаете:

$ time ./test.sh 3 0
success
./test.sh 3 0  0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1  0.00s user 0.01s system 0% cpu 3.012 total

Можно проверить статус выхода любой команды с $?:

$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1

В Вашем сценарии было несколько других ошибок. Ваш #! строка была уродлива, который я зафиксировал. Вы присваиваетесь $! кому: $b, но не используйте $b.

20
27.01.2020, 19:48

Удалите обратные галочки.

Как, Вы выполняетесь wait в подоболочке, которая не имеет доступа к заданиям родительской оболочки, таким образом, он сразу перестанет работать.


Если Вы хотите статус выхода, получаете значение $? сразу после ожидания.

command_here &
wait
status=$?
12
27.01.2020, 19:48

Удаление обратных галочек заставит программу работать, но не полностью из-за причин, уже определенных. Это верно это wait сбои сразу, потому что это работает в подоболочке и не может получить доступ к процессам своего родителя, но программе, не работали бы как ожидалось даже при использовании команды, которая действительно работала.

if оператор запускает программу и проверяет, является ли ее статус выхода нулем или ненулевой. При использовании обратных галочек, если оператор возьмет вывод процесса, попытайтесь выполнить его как программу и затем использовать код выхода для того процесса. Таким образом, программа не перестала работать потому что wait сбои, а скорее это перестало работать потому что wait не производит вывода.

Можно заставить сценарий работать при помощи echo в обратных галочках:

if `echo wait $!`; then
    echo success
else
    echo failure
fi

Или просто удалите обратные галочки; легче для всех.

2
27.01.2020, 19:48

Теги

Похожие вопросы