Получить только второй последний аргумент предыдущей команды

Если вам нужен текстовый режим для изменения размера разделов, вы можете попробовать parted: https://www.centos.org/ docs / 5 / html / 5.2 / Deployment_Guide / s2-disk-storage-parted-resize-part.html

3
23.09.2017, 10:13
2 ответа

Для этого и созданы функции:

print_if_not_regular() {
  [ -f "$1" ] || printf '%s\n' "$1"
}
print_if_not_regular /root/.bash_aliases

Некоторые оболочки, такие как esили zsh, имеют анонимные функции:

(){[ -f "$1" ] || printf '%s\n' $1} /root/.bash_aliases # zsh
@ {[ -f $1 ] || printf '%s\n' $1} /root/.bash_aliases # es

Я бы не стал использовать $_. Это больше не работает, например, если у вас есть ловушка DEBUG.

$ bash -c 'trap ": \"\$((cmdcount+=1))\"" DEBUG; echo foo; echo "$_"'
foo
2

Обратите внимание, что !:n— это не n й аргумент последней команды, а n й лексический токен предыдущей командной строки (последней строки (возможно, даже многострочный )сохраняется в истории ). Например, в

echo $(echo A B)
echo foo; echo !:1

Что !:1не расширяется доfoo(последнего аргумента последней команды )иB(последнего аргумента echoиз команды echoпредыдущей командной строки ). ], но $(echo A B). Здесь вам нужно будет ввести:

[ -f /root/.bash_aliases ] ||
  echo !:2

То есть введите его на отдельных строках. Здесь,случается, что (он работает случайно ), даже если строка истории не полностью завершена к тому времени, когда вы вводите вторую строку. Тот же трюк не работает ни в (t)csh(, где расширения истории происходят из ), ни zsh.

4
27.01.2020, 21:12

Используйте

test -f /root/.bash_aliases || echo "$_"

или

test -f /root/.bash_aliases || printf '%s\n' "$_"

$_расширится до последнего аргумента предыдущей команды. В вашем примере предыдущая команда — [, а ее последний аргумент — ].

Выше последняя команда — test, а ее последний аргумент — имя файла.

testи [— это одни и те же команды, но [требует ]в качестве последнего аргумента командной строки. В данном случае именно это затрудняет использование $_для получения имени файла.

Вышеприведенное решение работает как минимум в bash(, если у вас нет DEBUGнабора ловушек )и zsh.


Если у вас есть имя файла в переменной, это было бы тривиально сделать

[ -f "$name" ] || printf '%s\n' "$name"

или

if [ ! -f "$name" ]; then
    printf '%s\n' "$name"
fi

в зависимости от ваших предпочтений для операторов ifи коротких -логических тестов схемы.

3
27.01.2020, 21:12

Теги

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