Bash команда запуска в соответствии с переменной среды - PullRequest
0 голосов
/ 02 мая 2020

См. Я хочу скопировать файл в место назначения: cp filename /home/example/temp.txt.

. Вопрос filename будет изменен некоторыми программами, а новое имя будет записано в файле /home/example/.env. .

Мне нужен псевдоним типа alias cpf=cp ${filename} /home/nope/temp.txt to .bashr c, тогда мне нужно только запустить cpf, если я хочу скопировать последние finename в /home/example/temp.txt.


Что я пробовал:

eval $(grep -v "^#" "/home/example/.env") cp ${filename} /home/nope/temp.txt

и не смог получить ${filename}.

Есть ли какие-то изменения, чтобы сделать то, что я пробовал работать?

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Пример .env:

key1='do not put me in the environment'
key2=1231
filename=thisvaluechanges
key4="I hate being evaluated"

Вы хотите оценить только строку с filename. Сначала проверьте, как вы можете выбрать эту строку, например,

grep "^filename=" /home/example/.env
# or
sed -n 's/^\s*filename\s*=\s*/filename=/p' /home/example/.env

Затем вы можете source выделенную строку.

source <(grep "^filename=" /home/example/.env)

Когда имя файла является фиксированной строкой (без $() это необходимо оценить), вы можете обойтись без source:

cp $(grep "^filename=" /home/example/.env) /home/nope/temp.txt

Прежде чем поместить это в alias, помните, что function может делать все, что может alias, и могу сделать больше. Вы «должны» прекратить использование alias.
Если у вас есть три или четыре файла, например, filename1, 2, 3, 4, вы можете использовать функцию с аргументом:

cpf() {
   if (( $# = 0 )); then
      echo "Usage: cpf filenumber"
   else
      cp $(grep "^filename${1}=" /home/example/.env) /home/nope/temp.txt
   fi
}

Вы можете вызвать функция с cpf 2 для filename2.
Если вы хотите поместить имя файла в среду, вы можете изменить функцию

source <(grep "^filename${1}=" /home/example/.env)
1 голос
/ 02 мая 2020

Я предполагаю, что если предположить, что /home/example/.env содержит:

#!/bin/bash
# bash sourcable file
filename=$(echo 123)

, то вы хотите:

#!/bin/bash
cpf() {
   (
      . /home/example/.env
      cp "$filename" /home/nope/temp.txt
   )
}

Примечания:

  • eval - это злой. Использование eval $(grep...) очень опасно.
  • Всегда не забывайте указывать свои расширения.
...