Любой способ инициировать расширение параметров bash по внешнему файлу? [Дубликат]

Другое решение будет:

Использует vm.$root.$emit в grand-child, затем использует vm.$root.$on у предка (или где угодно).

Vue.component('parent', {
  template: '<div>I am the parent - {{ action }} <child @eventtriggered="performAction"></child></div>',
  data(){
    return {
      action: 'No action'
    }
  },
  created: function () {
  	this.$root.$on('eventtriggered1', () => {
    	this.performAction()
    })
  },
  methods: {
    performAction() { this.action = 'actionDone' }
  }
})

Vue.component('child', {
  template: '<div>I am the child <grand-child @eventtriggered="doEvent"></grand-child></div>',
  methods: {
    doEvent() { 
    	//this.$emit('eventtriggered') 
    }
  }
})

Vue.component('grand-child', {
  template: '<div>I am the grand-child <button @click="doEvent">Do Event</button></div>',
  methods: {
    doEvent() { this.$root.$emit('eventtriggered1') }
  }
})

new Vue({
  el: '#app'
})
<script src="https://unpkg.com/vue/dist/vue.js"></script>

<div id="app">
  <parent></parent>
</div>

13
задан Kent Pawar 21 January 2013 в 10:04
поделиться

8 ответов

Это решение не изящно, но оно работает. Создать вызов скрипта shell_expansion.sh:

echo 'cat <<END_OF_TEXT' >  temp.sh
cat "$1"                 >> temp.sh
echo 'END_OF_TEXT'       >> temp.sh
bash temp.sh >> "$2"
rm temp.sh

Затем вы можете вызвать этот скрипт следующим образом:

bash shell_expansion.sh Text_File.msh Text_File_expanded.msh
8
ответ дан Hai Vu 22 August 2018 в 01:41
поделиться
  • 1
    Спасибо @Hai Vu. Сначала я установил переменную $ LOG_FILE_PATH=/some/path, затем выполнил $ ./shell_expansion.sh Text_File.msh Text_File_expanded.msh (а также $ bash shell_expansion.sh Text_File.msh Text_File_expanded.msh), но в Text_File_expanded.msh записи $ LOG_FILE_PATH заменяются пробелами пробелов. Возможно, я ошибаюсь. – Kent Pawar 21 January 2013 в 10:37
  • 2
    Я не export редактировал переменные. После того, как я попробовал $ export LOG_FILE_PATH=/sone/path/, он работал нормально. Благодаря! :) – Kent Pawar 21 January 2013 в 10:44
  • 3
    супер классная идея! – anishsane 21 January 2013 в 11:59
  • 4
    Нет необходимости использовать временные файлы, просто используйте eval - см. Ответ @ ThirteenThirtySeven. Кроме того, метод использования временных файлов несколько проблематичен (несколько экземпляров shell_expansion.sh будут записывать все в один и тот же файл, проблемы с разрешениями, проверку ошибок и т. Д. - временный файл создаст много потенциальных осложнений, которые необходимо подготовить или знать, чтобы избежать с уверенностью). – FooF 17 June 2015 в 02:15

Этот вопрос задан в другом потоке, и это лучший ответ IMO:

export LOG_FILE_PATH=/expanded/path/of/the/log/file/../logfile.log'
cat Text_File.msh | envsubst > Text_File_expanded.msh

, если на Mac установите сначала gettext: brew install gettext

см.: Принудительное bash для расширения переменных в строке, загруженной из файла

15
ответ дан Community 22 August 2018 в 01:41
поделиться

Если решение Perl подходит для вас:

Пример файла:

$ cat file.sh
spool on to '$HOME/logfile.log';
login 'username' 'password';

Решение:

$ perl -pe 's/\$(\w+)/$ENV{$1}/g' file.sh
spool on to '/home/user/logfile.log';
login 'username' 'password';
9
ответ дан Guru 22 August 2018 в 01:41
поделиться
  • 1
    Спасибо @Guru - я попробовал, и он отлично работает. Поскольку мне нужно избегать зависимости от Perl, я не могу применить это решение. Я не эксперт Perl, но мы уверены, что \w всегда будет правильно записывать имя переменной оболочки ..? – Kent Pawar 21 January 2013 в 10:52
  • 2
    Хорошо, я очнулся и получил свой ответ - 1. Ссылка PERL : \ w будет соответствовать словам " символ (буквенно-цифровой плюс «»). 2. Ссылка на оболочку UNIX : имя переменной может содержать только буквенно-цифровые символы и «». – Kent Pawar 21 January 2013 в 10:56
  • 3
    @KentPawar: вы поняли это правильно. – Guru 21 January 2013 в 10:59
  • 4
    Привет всем - Typos в моем предыдущем комментарии: "_" был взят как не помеченный как код, и поэтому использовался, чтобы сделать текст курсивом. Извините. – Kent Pawar 21 January 2013 в 11:31
  • 5
    Я попробовал ваш скрипт. он работает почти отлично. Он заменит действительно все переменные env независимо от того, какие они определены или нет. Я думаю, было бы полезно избежать замены переменных, которые не определены. – aprodan 16 March 2017 в 18:38

Это решение позволяет сохранить одинаковое форматирование в файле ouput

Скопировать и вставить следующие строки в ваш скрипт

cat $1 | while read line
do
  eval $line
  echo $line
  eval echo $line
done | uniq | grep -v '\$'

, это будет читать файл, переданный как аргумент по очереди, а затем обрабатывать, чтобы попытаться напечатать каждую строку дважды: - один раз без подстановки - один раз с заменой переменных. затем удалите повторяющиеся строки, затем удалите строки, содержащие видимые переменные ($)

1
ответ дан hcii 22 August 2018 в 01:41
поделиться

Если вы хотите его в одной строке (я не эксперт по bash, поэтому могут быть оговорки к этому, но он работает везде, где я его пробовал):

, когда test.txt содержит

${line1}
${line2}

then:

>line1=fark
>line2=fork
>value=$(eval "echo \"$(cat test.txt)\"")
>echo "$value"
line1 says fark
line2 says fork

Очевидно, что если вы просто хотите его распечатать, вы можете вынуть дополнительные value=$() и echo "$value".

9
ответ дан Jojodmo 22 August 2018 в 01:41
поделиться
  • 1
    Если test.txt содержит, например, "; touch /etc/your_system_is_pwned; echo ", вы увидите «Плохие вещи». – Wildcard 21 December 2017 в 10:52

Одно из ограничений приведенных выше ответов заключается в том, что они оба требуют, чтобы переменные были экспортированы в среду. Вот то, что я придумал, чтобы переменные были локальными для текущего сценария оболочки:

#!/bin/sh
FOO=bar;
FILE=`mktemp`; # Let the shell create a temporary file
trap 'rm -f $FILE' 0 1 2 3 15;   # Clean up the temporary file 

(
  echo 'cat <<END_OF_TEXT'
  cat "$@"
  echo 'END_OF_TEXT'
) > $FILE
. $FILE

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

Спасибо за предыдущие ответы за их идеи!

8
ответ дан Kent Pawar 22 August 2018 в 01:41
поделиться
  • 1
    Спасибо @PaulGear! Добро пожаловать в StackOverflow. +1 Для использования trap для очистки временных файлов. Я предложил некоторые изменения, чтобы облегчить для новичков, таких как я, понять код; любезно просмотрите изменения и верните их, если потребуется. благодаря – Kent Pawar 4 July 2013 в 07:17
  • 2
    Я не получил сигнал, на который ссылается 0. – Kent Pawar 4 July 2013 в 07:19
  • 3
    0 означает нормальный выход, а не сигнал. – Paul Gear 5 July 2013 в 10:57
  • 4
    Я не уверен, почему вы думаете, что semis необходимы для переменных назначений и ловушек, но не для эхо и кошек, но комментарии полезны, поэтому я не планирую возвращаться. – Paul Gear 5 July 2013 в 10:59
  • 5
    – Kent Pawar 5 July 2013 в 11:29

Создайте файл ascii test.txt со следующим содержимым:

Try to replace this ${myTestVariable1} 
bla bla
....

Теперь создайте файл «sub.sed», содержащий имена переменных, например

's,${myTestVariable1},'"${myTestVariable1}"',g;
s,${myTestVariable2},'"${myTestVariable2}"',g;
s,${myTestVariable3},'"${myTestVariable3}"',g;
s,${myTestVariable4},'"${myTestVariable4}"',g'

Открыть терминал переместится в папку, содержащую test.txt и sub.sed. Определите значение заменяемой переменной

myTestVariable1=SomeNewText

Теперь вызовите sed, чтобы заменить эту переменную

sed "$(eval echo $(cat sub.sed))" test.txt > test2.txt

Выход будет

$cat test2.txt

Try to replace this SomeNewText 
bla bla
....
0
ответ дан mcExchange 22 August 2018 в 01:41
поделиться

Если переменные, которые вы хотите перевести, известны и ограничены по количеству, вы всегда можете сделать перевод самостоятельно:

sed "s/\$LOG_FILE_PATH/$LOG_FILE_PATH/g" input > output

А также предполагая, что сама переменная уже известна

1
ответ дан tvCa 22 August 2018 в 01:41
поделиться
Другие вопросы по тегам:

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