Как настроить этот псевдоним `scratch` для Bash с помощью переменной` PS2`?

Вот сценарий, который извлекает файл tar.gz верхнего уровня (My_Tar.tar.gz) в $ NEWDIR, затем просматривает извлеченное содержимое и извлекает все обнаруженные файлы tar в каталоги на основе этих имен файлов tar. Если вложенные файлы tar были созданы «над» их содержимым (так, например, в Nested_Tar.tar уже есть подкаталог «Nested_Tar /»), то вы можете пропустить часть mkdir ниже, а также параметр -C "$ d" для внутреннего tar .

NEWDIR=output
tar -xz -C $NEWDIR -f ../My_Tar.tar.gz
(cd $NEWDIR;
for f in *.tar
do
  d=$(basename "$f" .tar)
  mkdir "$d" && tar -x -C "$d" -f "$f"
done
)

Я использовал подоболочку только для того, чтобы сохранить pwd вашей существующей оболочки в cwd; если вы предпочитаете оказаться внутри $ NEWDIR, просто удалите внешнюю скобку.

2
10.06.2019, 12:18
2 ответа

Я не совсем уверен, что это полезно для (по сравнению с nano, vimили любым редактором, который вам нравится ), но... нужен ли ему псевдоним?

$ <<.
> foo
> bar
> baz
>.

Просто "будет еще короче, но будет сообщение об ошибке...

$ "
> oh
> ah
> ui
> "
bash: $'\noh\nah\nui\n': command not found

Заметьте, эти вещи на самом деле никуда не делись...

$ history
  497  <<.
foo
bar
baz
.

Если вас это беспокоит, сначала отключите историю, а потом очистите ее.

Для пользовательской подсказки PS2 это сложно, поскольку (по крайней мере для Bash )она должна быть установлена ​​на родительскую оболочку. Если вы установите его в подоболочке, он будет проигнорирован. Вы можете обойти это, запустив явный экземпляр оболочки, подобный этому...

$ PS1=@_ PS2=:_ bash --norc
@_<<.
:_hey
:_.
@_exit
$

Но сейчас имеет смысл написать специальную программу очистки и удаления.

Другой подход, вообще не использующий подсказку PS2:

$ while read -p ":-> " ; do : ; done
:-> hey
:-> how 
:-> do

Только нельзя использовать '.' чтобы выбраться отсюда. Ну, вы могли бы легко добавить это как условие...

$ alias scratch='(var=_; while read -r -p ":-> " var; do [ "$var" ==. ] && break; done)'
$ scratch
:-> a
:-> b
:-> c
:->.

Однако вы также можете просто выйти, отправив EOF с помощью Ctrl + D .

1
27.01.2020, 22:08

Используйте readдля чтения ввода построчно. Вы можете указать подсказку. Следующий фрагмент кода читает строки и игнорирует их содержимое до тех пор, пока не появится строка, состоящая из необязательных пробелов вокруг одной точки, или пока вы не нажмете Ctrl + D на пустой строке.

scratch () {
  local line
  while [[ "$line" != "." ]] && read -r -e -p "scratch> " line; do :; done
}
1
27.01.2020, 22:08

Теги

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