Экземпляр ec2 можно идентифицировать по его instance-id, который никогда не изменится, независимо от того, сколько раз вы останавливали и запускали экземпляр. Если у вас есть идентификатор экземпляра и вам нужен его IP-адрес, вы можете попробовать следующее.
Для публичного IP-адреса:
aws ec2 describe-instances --instance-ids i-b78a096f | grep PublicIpAddress | awk -F ":" '{print $2}' | sed 's/[",]//g'
Для частного IP-адреса:
aws ec2 describe-instances --instance-ids i-b78a096f | grep PrivateIpAddress | head -1 | awk -F ":" '{print $2}' | sed 's/[",]//g'
Тем не менее, я думаю, что будет намного лучше, если вы попробуете сделать то же самое на python. Я реализовал ту же логику в своей предыдущей организации с помощью библиотеки python boto, и это было намного проще и управляемее.
настройка виртуального env:
#!/usr/bin/env bash
set -e
HOME_DIR=/home/$(whoami)
#Dependencies
sudo apt-get install ncurses-devel patch openssl openssl-devel zlib-devel
# Install python locally
mkdir -p $HOME_DIR/src
mkdir -p $HOME_DIR/.localpython
cd $HOME_DIR/src
wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar -zxvf Python-2.7.8.tgz
cd Python-2.7.8
./configure --prefix=$HOME_DIR/.localpython
make
make install
# Install virtualenv locally
cd $HOME_DIR/src
wget --no-check-certificate https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz#md5=f61cdd983d2c4e6aeabb70b1060d6f49
tar -zxvf virtualenv-1.11.6.tar.gz
cd virtualenv-1.11.6/
~/.localpython/bin/python setup.py install
# Create a test virtual environment
mkdir -p $HOME_DIR/virtualenvs
cd $HOME_DIR/virtualenvs
~/.localpython/bin/virtualenv my_virtual_env --python=$HOME_DIR/.localpython/bin/python2.7
cd my_virtual_env
source bin/activate
pip install awscli
Это, безусловно, связано с тем, как вы закрываете дескриптор файла, который вы открыли ранее для стандартного ввода. Использование ниже должно быть в порядке
exec 10<&-
Когда вы выполняете 0<10
, вы указываете оболочке искать и поглощать содержимое файла с именем 10
в вашем текущем каталоге, что делает бессмысленным в данном контексте.
В bash
вы также можете использовать альтернативную форму exec 10>&-
, которая достигает той же цели закрытия дескриптора.
Но при этом вам не нужно использовать exec
для произвольного файлового дескриптора и читать ввод, вы можете просто прочитать ввод с помощью метода подстановки процесса в bash
формы < <()
как
while IFS= read -r line; do
arr["$count"]="$line"
((count++))
done< <(pgtoscrap)
exec 10<&0
клонирует дескриптор файла с номера 0 в номер 10, эффективно сохраняя оригинал, чтобы вы могли заменить файл на fd 0 в следующей строке. Чтобы отменить это, вам нужно поменять местами числа, клонировать номер 10 в номер 0, exec 0<&10
(, а затем закрыть fd 10 с помощьюexec 10<&-
).
С другой стороны, exec 0<10
без амперсанда — это просто перенаправление с именем файла 10
. Поскольку у вас нет такого файла, вы получите сообщение об ошибке.
Тем не менее, вам не нужно использовать exec
для временной настройки перенаправления для цикла while. Составные команды также могут принимать перенаправления, например:
while read LINE; do
...
done < "$filename"
Если вы хотите читать полные строки, как они есть, без пробелов или обратной косой черты, влияющих на данные, вам нужно сбросить IFS
для read
и использовать read -r
. Кроме того, если вы добавляете к массиву, вам не нужно вручную следить за индексами, вы можете просто использовать +=
для добавления непосредственно в массив:
arr=() # declares it an array and clears it, not strictly necessary though
while IFS= read -r line; do
arr+=("$line")
done < "$filename"
Или используйтеmapfile
(readarray
)вместо ручного цикла, как @BlackJack упоминает в комментариях:
mapfile -t arr < "$filename"
Или вообще без временного файла:
#/bin/bash
mapfile -t arr < <(curl -s https://unix.stackexchange.com/)
(Без -t
mapfile
оставляет ограничители строк на месте.)