Подстановка команд как переменная в одну строку

Я получаю следующую ошибку:

> 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
Другие вопросы по тегам