Отдельное состояние выполнения переданных по каналу команд

Существует плагин, называемый CodeoverView, который можно использовать на Windows (и Mac?): http://www.vim.org/scripts/script.php?script_id=2888 ?

0
15.04.2015, 13:48
2 ответа

В команде, где у нас есть много труб, перенаправляющих их выходы, есть ли способ узнать ценность эхо? До половины его исполнения или до определенного количества труб, в отличие от общего состояния всей команды?

В Bash есть вариабельность Pipestatus , которая представляет собой массив, содержащий состояние выхода каждой команды в самом последнем конвейере.

$ ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /bin/*|head -1|tr -s " "| \
  cut -d " " -f 9|date --date - +%s
1429070400
$ echo ${PIPESTATUS[@]}
141 0 0 141 0
$ kill -l `expr 141 - 128`
PIPE

Это говорит нам, что LS и командам , вырезанные с помощью SIGPIPE, который ожидается, что их вывод не был полностью потребляется следующей командой в трубопроводе.

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

Это связано с датой дата команда , работающая как она ожидает, но, я думаю, не так, как вы ожидаете.

Дата --дата - не читает дату от stdin; Вместо этого он использует - как строка даты. Я не вижу, где подразумевается значение одинокого - , но, похоже, совпадает как 0 или 0000 , что означает «полуночь сегодня".

1
28.01.2020, 02:36

У вас есть эта команда

ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /some/path/*.dat|head -1|tr -s " "|cut -d " " -f 9|date --date - +%s

Проблема с этим состоит в том, что дата не ожидает его параметров через stdin , поэтому вам нужно разделить его на две части. Вы уже попытались этому во второй части вашего вопроса:

var1=$(ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /some/path/*.dat|head -1|tr -s " "|cut -d " " -f 9)
echo "var1='$var1'"    # eg var1='11:37:39'
var2=$(date --date="$var1" +%s)
echo "var2='$var2'"    # eg var2='1429094259'

Однако, когда вы запустите команду дата , она дает вам время (11:37:39 - 1429094259) для Сегодня (сравните его с ценностью для var2 с моим 11:04:45 - 1429092286, и вы увидите, что они очень похожи).

Возможно Stat --Format '% y' /tmp/path/*.dat Было бы легче?


Некоторые ответы на конкретные вопросы

Есть ли способ узнать Значение echo $? [Средний путь через трубу]? Не напрямую, нет. Тем не менее, вы сможете либо разделить трубопровод на две части с временным файлом для удержания промежуточных результатов или сохранения от $? значение, как вы идете.

cmd1 | ( cmd2; SS=$?; echo $SS >/tmp/cmd2.ss; exit $SS ) | cmd3
cmd2_status=$(</tmp/cmd2.ss)

Как я могу сделать то, что я хочу в одном трубопроводе? Вы можете оценить время и пройти, что на сегодняшний день, что-то вроде этого

date --date=$( cmd1 | cmd2 | cmd2 ) +%s

Почему дата --дация = - Время в полночь? Дата Команда пытается сделать что-то значимое с неверной датой «-». Это происходит, что это в конечном итоге интерпретируется как «полуночная сегодня». Я бы не буду банк на этом, хотя; Если вы действительно хотите полуть, я бы пошел на явную дату --дате = '00: 00 '

1
28.01.2020, 02:36

Теги

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