Como observado em man bash
(observe que seu /bin/sh
pode ser algo diferente de bash, mas o mesmo se aplica a outros shells parecidos com Bourne):
The format of here-documents is: <<[-]word here-document delimiter No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word. If any charac‐ ters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, the charac‐ ter sequence \<newline> is ignored, and \ must be used to quote the characters \, $, and '.
A parte fundamental aqui para entender seu caso é
If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion
, o que significa que coisas como $pid
, $x
e assim por diante terão seus valores do shell local, e não da sessão SSH remota. O erro
error: process ID list syntax error
é consistente com $pid
estando vazio na substituição do comando ps -p $pid -o %cpu,%mem,cmd,vsize
Note que se você citou a expansão da variável - que é um bom hábito entrar em
ps -p "$pid" -o %cpu,%mem,cmd,vsize
você teria um erro ligeiramente mais útil list of process IDs must follow -p
Você pode evitar que variáveis individuais sejam expandidas prematuramente por barras invertidas escapando delas, por exemplo. \$pid
No entanto, no seu caso, a única coisa que você deseja expandir é $server
- e isso está fora do documento here, portanto, você também pode evitar a expansão any citando word
:
for server in servername; do
ssh $server << 'EOF'
.
.
EOF
done