Создайте временный файл и отредактируйте его содержимое и верните путь к файлу - PullRequest
0 голосов
/ 03 марта 2020

I sh чтобы создать временный файл, используя mktemp, а затем отредактировать его содержимое после создания (используя предпочитаемый вами редактор; я использовал micro), а затем, когда он завершится, т.е. сохранится / выйдет из процесса, он должен вывести путь в файл, чтобы stdout / pipe / заменить на месте в качестве аргумента.

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

То, что я пытался.

# creates a file. passes it's path to editor to open it. 
# then we can make changes and save. finally quit.
> micro (mktemp)

Но вывод - ничто, я хочу, чтобы быть переданным исходным путем. Как я могу это сделать?

Это примеры использования, они не работают, так как я не могу вывести путь после сохранения.

# e.g. a full test case; create tmp file, fill it, read it, find it...
> micro (mktemp) | cat | grep 'find me*!'

# or you want to count the words
> micro (mktemp) | tail | wc 

# another way it should work as well! i.e. pros-sub
> cat (micro (mktemp)) | sed 's/red/green/g'

# bonus points (I mean it, 50 extra karma). You might need to restructure the chain
# i.e. ->create tmp, fill it, save it, read it, manipulate it, save it 
# back to disk (append/replace)
> cat (micro (mktemp)) | sed ' s/red/green/g' >> <original_file_path>

Я работаю в fish, потому что у меня розовые глаза и я ищу решение в этом. Однако, если вы уже знаете это в bash, хотели бы увидеть это и могут быть полезны. Так что я буду отмечать оба

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

В оболочке fi sh вы можете определить функцию, здесь mt:

function mt
  set -l path (mktemp)
  micro $path </dev/tty >/dev/tty
  cat $path
 end

Теперь ваши конвейеры могут работать с mt:

mt | wc
1 голос
/ 03 марта 2020

Вот решение bash.

Поместите путь в переменную, чтобы вы могли использовать его позже в скрипте.

Чтобы получить выходные данные команды, вы используете $(command) не только (command)

temp=$(mktemp)
micro "$temp"
wc < "$temp"
...