Как подключиться к zsh с расширением псевдонима?

Используйте jq:

$ echo $a | jq '.[][0]["**DATA_DATE**"]'
"2017-03-09 00:00:00"

Поскольку jq может быть доступен не во всех дистрибутивах, и вы можете не захотеть компилировать его самостоятельно, вы можете воспользоваться преимуществами многих других языков сценариев, которые имеют поддержку JSON в своих базовых библиотеках.

Перл:

$ perl -e "use JSON::Parse 'parse_json'; my \$a = parse_json ('$(echo $a)'); print \$a->{'content'}[0]{'**DATA_DATE**'}"
2017-03-09 00:00:00

Питон:

$ python -c "import json; a=json.loads('$(echo $a)'); print(a['content'][0]['**DATA_DATE**'])"
2017-03-09 00:00:00

Рубин:

$ ruby -e "require 'json'; puts JSON.parse('$a')['content'][0]['**DATA_DATE**'];"
2017-03-09 00:00:00

Конечно, вы можете (ab )использовать стандартные инструменты *nix (GNU )для получения значений из этого конкретного примера JSON, но это действительно неудобно. Вы можете занять первую строку. Как только структура JSON изменится, ваш код будет вести себя непредсказуемо.

2
02.10.2019, 18:57
1 ответ

Конвейерный код в zshзапускает этот код в отдельном процессе. Этот процесс не имеет ваших интерактивных настроек, таких как псевдонимы и функции (, он не читает.zshrc)и не имеет переменных оболочки и другого состояния текущей оболочки. Состояние этого другого процесса, например текущего каталога, теряется при завершении этого процесса.

Чтобы выполнить код в текущем процессе оболочки, передайте его как аргумент (, а не как ввод )встроенной функции eval.

eval "$(<~/.zsh_history cut -d ';' -f 2 | sk --tac)"

Но для этого конкретного случая выбора записи истории есть и другой способ. Встроенная функцияfc. Следующая команда запускает функцию fcedit_skс одним аргументом — именем временного файла. При вызове функции файл содержит все записи истории.(${${(kn)history}[1]}— индекс самой старой записи, а -1— самая новая запись ). Когда функция возвращается, zsh выполняет все, что содержится в файле, как если бы вы ввели его в командной строке.

fc -e fcedit_sk ${${(kn)history}[1]} -1

Сделайте fcedit_skфункцией, которая вызывает skдля содержимого файла и записывает свои выходные данные обратно в файл. Я не знаю sk, поэтому я не знаю, есть ли способ проще, чем этот:

fcedit_sk () {
  local output
  output=$(sk --tac <$1)
  if (($?)); then
    echo >|$1 # Cancelled
  else
    print -lr -- $output >|$1
  fi
}
1
27.01.2020, 22:16

Теги

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