Как написать следующий скрипт в одну строку?

Настройки прозрачности не являются частью tmux, вам нужно изменить profile preferencesс вашегоterminal

Edit > Profile preferences > Colors

снимите флажки Use transparency from system themeи

проверитьUse transparent background

настроить уровень непрозрачности и все

-4
21.11.2019, 21:16
3 ответа

Используйте env_parallelиз GNU Parallel.

Ваш код действительно трудно читать, и другим будет сложно его поддерживать. Будет проще, если он будет разбит на более мелкие функции, которые экспортируются на удаленные серверы.

env_parallel --session
servers() {
  /swb/local/scripts/swdList -p SMARTS -a A5SV_2017.1b -e 1 --type=instance --function=SAM --priority=1 |
    grep -v sis
}
doit() {
  # Run this on every server
}
env_parallel --nonall --slf <(servers) doit
0
28.01.2020, 05:20

Я смог подавить желание плакать достаточно долго, чтобы свободно применить ;к вашему сценарию, чтобы сделать его одной строкой:

Y= [...]; for X in `shell command $Y`; do echo "=== "$X" on "$Y" ==="; Z=`echo $X | awk -F\/ '{print $2}'`; for W in `shell command ${Z} awk -F\: '{print $3}'`; do echo -n $W; V=`shell command ${Z} ${W}`; echo -n  ",V="$V; U=`shell command $Y`; echo -n ",T="$U; echo; done; echo; done

Также :это не сработает, хотя бы потому, что Y= [...]недопустимая команда, но, возможно, и другие вещи.

3
28.01.2020, 05:20

Я бы посоветовал, несмотря на то, что я полностью согласен с комментариями под вашим постом, сначала написать то же самое как можно короче (кроме того, чтобы привыкнуть не использовать обратные кавычки, один символ, как правило, избавляет вас от многих проблем для более сложные/вложенные случаи подстановки команд ).

Y=[...]
for X in $(shell command $Y); do
    echo ===\ $X\ on\ $Y\ ===
    Z=$(echo $X | cut -d/ -f2)
    for W in $(shell command $Z | cut -d: -f3); do 
        echo $W,V=$(shell command $Z $W),T=$(shell command $Y)
    done
    echo
done

Затем удалите все ненужные идентификаторы, заменив необходимые (=значимые )строки -разрывами запятой -двоеточия (+ пробел для удобства чтения ).

Y=[...]; for X in $(shell command $Y); do echo ===\ $X\ on\ $Y\ ===; Z=$(echo $X | cut -d/ -f2); for W in $(shell command $Z | cut -d: -f3); do echo $W,V=$(shell command $Z $W),T=$(shell command $Y); done; echo; done

Если Ваша цель сделать его как можно короче, Вы можете удалить все ненужные пробелы:

Y=[...];for X in $(shell command $Y);do echo ===\ $X\ on\ $Y\ ===;Z=$(echo $X|cut -d/ -f2);for W in $(shell command $Z|cut -d: -f3);do echo $W,V=$(shell command $Z $W),T=$(shell command $Y);done;echo;done

Или, если Вы хотите сделать это по-другому, Вы можете попробовать:

Y=[...];shell command $Y|xargs -n1 bash -c "echo ===\\ \$1\\ on\\ $Y\\ ===;Z=\$(echo \$1|cut -d/ -f2);shell command \$Z|cut -d: -f3|xargs -n1 bash -c \"echo \\\$1,V=\\\$(shell command \$Z \\\$1),T=\\\$(shell command $Y)\";echo"

или:

Y=[...];bash -c "for X in \$*;do echo ===\ \$X\ on\ \$*\ ===;bash -c \"for W in \\\$(shell command \\\$*|cut -d: -f3);do echo \\\$W,V=\\\$(shell command \\\$* \\\$W),T=\\\$(shell command $Y)\";echo\$(echo \$X|cut -d/ -f2)" $(shell command $Y)

Также вы можете оптимизировать $ (команду оболочки ), если это всегда одна и та же команда оболочки (, отпустите оболочку и просто напишите команду, не делайте из нее переменную раньше, например.:

Y=[...];C='shell command';for X in $($C $Y);do echo ===\ $X\ on\ $Y\ ===;Z=$(echo $X|cut -d/ -f2);for W in $($C $Z|cut -d: -f3);do echo $W,V=$($C $Z $W),T=$($C $Y);done;echo;done

Или даже:

Y=[...];C='shell command';E=echo;for X in $($C $Y);do $E ===\ $X\ on\ $Y\ ===;Z=$($E $X|cut -d/ -f2);for W in $($C $Z|cut -d: -f3);do $E $W,V=$($C $Z $W),T=$($C $Y);done;$E;done

Особенно последний выглядит очень технично, я думаю, что я предпочитаю его как одну -строку :-D

0
28.01.2020, 05:20

Теги

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