в сценарии интерпретируется как начало здесь-документа.
Обычно здесь-документ записывается как, например,
cat <
... но вполне нормально использовать $ Output
или любую другую строку в качестве разделителя здесь-документа.
Вы, вероятно, хотели использовать , но это тоже было бы неправильно, так как это было бы воспринято как попытка чтения из файла
$ Output
, который является не имя файла, а результат вашего конвейера.
Попробуйте вместо этого передать вывод в цикл while, как вы это делали в командной строке:
#!/bin/bash
snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my \
-v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null |
awk '{print $4}' |
while read -r line; do
echo "Drive $line"
done
Я предпочитаю использовать printf
, а не echo
, когда требуется вывод чтобы содержать данные, предоставленные пользователем (на самом деле любые данные, поступающие извне сценария):
printf 'Drive %s\n' "$line"
См. « Почему printf лучше, чем echo? »
Обновлено:
Если ваш вывод должен выглядит как
Drive1 online(1)
Drive2 online(1)
... etc.
, где число после Drive
строго увеличивается на единицу для каждой строки, тогда вам понадобится счетчик в цикле:
while read -r line; do
printf 'Drive%d %s\n' "$(( ++count ))" "$line"
done
Во-первых, я бы проверил все места, откуда tcsh выполняет команды при запуске.
На справочной странице сказано следующее (Я выделил жирным шрифтом расположение файлов):
A login shell begins by executing commands from the system files /etc/csh.cshrc and /etc/csh.login. It then executes commands from files in the user's home directory: first ~/.tcshrc (+) or, if ~/.tcshrc is not found, ~/.cshrc, then ~/.history (or the value of the histfile shell variable), then ~/.login, and finally ~/.cshdirs (or the value of the dirsfile shell variable) (+). The shell may read /etc/csh.login before instead of after /etc/csh.cshrc, and ~/.login before instead of after ~/.tcshrc or ~/.cshrc and ~/.history, if so compiled; see the version shell variable. (+)
Если это вас ни к чему не приведет, я бы попробовал следующие две вещи:
w
-, который должен показать вам, что работает этот пользователь. Ctrl+Z
вместо Ctrl+C
-, что должно приостанавливать запущенный процесс, а не прерывать его. Затем jobs
, чтобы увидеть, что было приостановлено. РЕДАКТИРОВАТЬ :Как указал JdeBP в комментариях, вы также можете установить параметры -x
и -V
на tcsh в su -, хотя я думаю, что вы могли бы найти оскорбительную вещь с помощью -X
. Примерно так:
su - troublesome_user -- -X