Подстановка команд как переменная в одну строку
Я получаю следующую ошибку:
> echo "${$(qstat -a | grep kig):0:7}"
-bash: ${$(qstat -a | grep kig):0:7}: bad substitution
Я пытаюсь взять номер раньше.
из
> qstat -a | grep kig
1192530.perceus- kigumen lr_regul pbs.sh 27198 2 16 -- 24:00:00 R 00:32:23
и использовать его в качестве аргумента qdel
в openPBS, чтобы я мог удалить весь процесс, который я начал с моим логином kigumen
так что в идеале это должно работать:
qdel ${$(qstat -a | grep kig):0:7}
Пока работает только это:
str=$(qstat -a | grep kig); qdel "${str:0:7}"
но я хочу чистый однострочник без временной переменной.
3 ответа
Используемая вами конструкция подстроки оболочки (:0:7
) работает только с переменными, а не с подстановкой команд. Если вы хотите сделать это за одну операцию, вам нужно будет обрезать строку как часть конвейера, что-то вроде этого:
echo "$(qstat -a | grep kig | sed 's/[.].*//')"
echo "$(qstat -a | awk -F. '/kig/ {print $1}')"
echo "$(qstat -a | awk '/kig/ {print substr($0, 1, 7)}')"
(Обратите внимание, что первые два печатают все перед первым ".", А последние печатают первые 7 символов.) Я не знаю, какие из них особенно чистые, но они делают это без временной переменной...
qstat -u palle | cut -f 1 -d "." | xargs qdel
Убивает все мои работы... обычно я вычеркиваю имена рабочих мест перед тем, как урезать...
Поэтому я использую небольшой скрипт "idlist":
qstat -u palle | grep -E "*.in" | grep -E "$1" | cut -f 1 -d "." | xargs
Чтобы увидеть все мои "map_..." вакансии:
idlist "map_*"
За убийство всех моих рабочих мест "map_....":
idlist "map_*" | xargs qdel
Еще один способ:
foreach m1 in $(qstat -a );do
if [[ $m1 =~ kig ]];then
m2=${m1%.kig}
echo "kig found $m2 "
break
fi
done