Я не можу зрозуміти, як отримати оболонку
це тлумачить сценарій, щоб "забути", що він робить це,
або для припинення діагностичної інформації, пов'язаної з скриптом
повідомлення про помилки.
Проте, поки цей контекст інформація зберігається через вилки
(у підгрупи), вона не передається через execs (до новий процеси оболонки).
Отже, за рахунок вилки / виведення нового процесу оболонки, ви можете це зробити
var=$(sh -c 'printf "1\r" > /dev/cu.usbserial' 2>&1)
який встановлює $var до
sh: /dev/cu.usbserial: Permission denied
Особливість sh -c що іноді бентежить людей
(особливо коли вони використовують його в find … -exec sh -c "…" {} ";" )
це додаткові аргументи командного рядка
(після -c і команда для запуску нової оболонки)
приймаються як параметри командного рядка для нової оболонки, починаючи з $0. І $0 розглядається як назва оболонки / сценарію,
який згодом використовується новою оболонкою для префіксації повідомлень про помилки.
Тому,
sh -c 'echo "Mellow rhymes with $2, but nothing rhymes with $1."; printf "1\r" > /dev/cu.usbserial' \
red orange yellow
(розбито на дві лінії виключно для читання)
Mellow rhymes with yellow, but nothing rhymes with orange.
red: /dev/cu.usbserial: Permission denied
Отже, якщо ви готові вдатися до kludgy hack, щоб отримати значення змінної
почати з чогось іншого, ніж sh: або bash:, використовуйте
var=$(sh -c 'printf "1\r" > /dev/cu.usbserial' error 2>&1)
який встановлює $var до
error: /dev/cu.usbserial: Permission denied
(зробивши, що оболонка це думає його назва є error ).
stderrдля вашого першого прикладуbash: /dev/cu.usbserial: Permission denied. Ви в порядку зbash:або ви знайшли спосіб уникнути цього?