sed - нет такого файла или каталога - PullRequest
0 голосов
/ 20 ноября 2018

Итак, я знаю, что эта тема обсуждалась несколькими способами, но ответы у меня не сработали.

Я использую sed для удаления строки из скрипта, нокаждый раз, когда я выполняю скрипт bash, я получаю сообщение об ошибке «Нет такого файла или каталога».Я могу запустить команду с удаленного хост-терминала.Смотрите команду sed ниже.

#!/bin/bash

declare server_list="/location/of/iplist.txt"
declare file="/location/of/file/to/modify"
declare regex='"/\export JAVA_HOME=\/jvm\/home\/directory\/java/d"'
declare file_content="$(sudo grep -Fxq export 
JAVA_HOME=/java/home/directory/java "${file}" )

declare script="sudo sed -i -e ${regex} ${file}"

date
cat ${server_list} |  while read server
do
# connect to each server and execute the "sed -i" command
ssh -I /location/of/pub/key ${server} -o StrictHostKeyChecking=no

# read file content into condition statement
${file_content}
if [ $? -eq 0 ];
then
    # confirm string exist and remove the line
    echo "JAVA_HOME located on ${server}"
    "${script}"
else
    echo "No JAVA_HOME located on ${server}"
fi
done

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Попробуйте использовать eval для выполнения переменного содержимого

declare file="/location/of/file/to/modify"
declare regex='"/\export JAVA_HOME=\/jvm\/home\/directory\/java/d"'
declare script="sudo sed -i -e ${regex} ${file}"
eval ${script}
0 голосов
/ 20 ноября 2018

Не помещайте полные команды в переменные."${script}" - это приглашение к неприятностям.

Наглядный пример:

me ~ > echo -e 'foo bar\nbaz qux' > /tmp/foobar

me ~ > cat /tmp/foobar
foo bar
baz qux

me ~ > sed -e '/foo bar/d' /tmp/foobar
baz qux

me ~ > cmd="sed -e '/foo bar/d' /tmp/foobar"

me ~ > $cmd
sed: -e expression #1, char 1: unknown command: `''

me ~ > ${cmd}
sed: -e expression #1, char 1: unknown command: `''

me ~ > "$cmd"
bash: sed -e '/foo bar/d' /tmp/foobar: No such file or directory

me ~ > "${cmd}"
bash: sed -e '/foo bar/d' /tmp/foobar: No such file or directory

Что здесь происходит?Если вы используете $cmd без кавычек, sed имеет следующие 4 аргумента:

  • -e
  • '/foo
  • bar/d'
  • /tmp/foobar

(да, именно так работают слова в bash).Очевидно, что sed не может интерпретировать этот бред.

Если вы попытаетесь запустить "$cmd" или "${cmd}", вся строка будет интерпретирована как команда name , пробелы в кавычках и все.Оболочка жалуется, что не может найти исполняемый файл с именем sed -e '/foo bar/d' /tmp/foobar, и это абсолютно правильно.Также ничего хорошего.

Решение?

Быстрый и грязный взлом

me ~ > eval ${cmd}
baz qux

Работает как положено!Однако eval опасен и не должен использоваться, если вы не являетесь сертифицированным гуру оболочки.(Которые вы, я полагаю, до сих пор нет).Лучшим вариантом является определение функции.

cmd() {
    sed -e '/foo bar/d' /tmp/foobar
}

...

cmd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...