Другое решение будет:
Использует 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>
Это решение не изящно, но оно работает. Создать вызов скрипта 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
Этот вопрос задан в другом потоке, и это лучший ответ 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 для расширения переменных в строке, загруженной из файла
Если решение 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';
\w
всегда будет правильно записывать имя переменной оболочки ..?
– Kent Pawar
21 January 2013 в 10:52
"_"
был взят как не помеченный как код, и поэтому использовался, чтобы сделать текст курсивом. Извините.
– Kent Pawar
21 January 2013 в 11:31
Это решение позволяет сохранить одинаковое форматирование в файле ouput
Скопировать и вставить следующие строки в ваш скрипт
cat $1 | while read line
do
eval $line
echo $line
eval echo $line
done | uniq | grep -v '\$'
, это будет читать файл, переданный как аргумент по очереди, а затем обрабатывать, чтобы попытаться напечатать каждую строку дважды: - один раз без подстановки - один раз с заменой переменных. затем удалите повторяющиеся строки, затем удалите строки, содержащие видимые переменные ($)
Если вы хотите его в одной строке (я не эксперт по 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"
.
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
должна быть заменена в файлах, названных в командной строке , Я уверен, что это может быть улучшено, но это работает для меня до сих пор.
Спасибо за предыдущие ответы за их идеи!
trap
для очистки временных файлов. Я предложил некоторые изменения, чтобы облегчить для новичков, таких как я, понять код; любезно просмотрите изменения и верните их, если потребуется. благодаря
– Kent Pawar
4 July 2013 в 07:17
Создайте файл 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
....
Если переменные, которые вы хотите перевести, известны и ограничены по количеству, вы всегда можете сделать перевод самостоятельно:
sed "s/\$LOG_FILE_PATH/$LOG_FILE_PATH/g" input > output
А также предполагая, что сама переменная уже известна
$ 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:37export
редактировал переменные. После того, как я попробовал$ export LOG_FILE_PATH=/sone/path/
, он работал нормально. Благодаря! :) – Kent Pawar 21 January 2013 в 10:44eval
- см. Ответ @ ThirteenThirtySeven. Кроме того, метод использования временных файлов несколько проблематичен (несколько экземпляровshell_expansion.sh
будут записывать все в один и тот же файл, проблемы с разрешениями, проверку ошибок и т. Д. - временный файл создаст много потенциальных осложнений, которые необходимо подготовить или знать, чтобы избежать с уверенностью). – FooF 17 June 2015 в 02:15