var=$(echo "asdf")
echo $var
# => asdf
Используя этот метод, команда сразу оценивается и сохраняется ее возвращаемое значение.
stored_date=$(date)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
То же самое с обратным шагом
stored_date=`date`
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
Использование eval в $(...)
не будет оцениваться позже
stored_date=$(eval "date")
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
Используя eval, он оценивается при использовании eval
stored_date="date" # < storing the command itself
echo $(eval $stored_date)
# => Thu Jan 15 11:07:05 EST 2015
# (wait a few seconds)
echo $(eval $stored_date)
# => Thu Jan 15 11:07:16 EST 2015
# ^^ Time changed
В приведенном выше примере, если вам нужно запустить команду с аргументами, поместите их в строку, которую вы храните
stored_date="date -u"
# ...
. Для сценариев bash это редко актуально, но последнее примечание. Будьте осторожны с eval
. Eval только строки, которыми вы управляете, никогда не строки, исходящие от ненадежного пользователя или созданные из ненадежного пользовательского ввода.
Согласно этому посту на форумах MSDN здесь .
Когда это происходит, данные, полученные в вашем случае, погружаются в ThreadPool и вызывают QueueUserWorkItem (), который выделяет поток пула потоков для вызова вашего обработчика событий DataReceived. Затем он снова немедленно вызывает WaitCommEvent (), чтобы дождаться следующего «чего-то интересного».
blockquote>Звучит так, как будто объект
SerialPort
используетThreadPool
, поэтому, хотя событиеDataReceived
вызывается для разныхThreads
, они уже существуют вThreadPool
и, следовательно, нет накладных расходов. для создания новых.Таким образом, событие может быть запущено даже тогда, когда вы там, потому что оно будет в другой ветке.