bash добавляет одинарные кавычки в > (перенаправление )во время раскрытия переменной (нарушение моего перенаправления)

Попробуйте joinкоманду:

join file1 file2

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628
0
20.08.2020, 01:40
1 ответ

Проблема действительно в порядке оценки.

Это просто помещает текст в командную строку. :Слишком поздно, чтобы оболочка реализовала перенаправление.

paul $ j=" > foo.txt "
paul $ echo Words Here $j
Words Here > foo.txt
paul $ ls -l foo.txt
ls: cannot access 'foo.txt': No such file or directory

Это заставляет оболочку повторно -оценить всю команду.

paul $ eval echo Words Here $j
paul $ ls -l foo.txt
-rw-r--r-- 1 paul paul 11 Aug 19 22:38 foo.txt
paul $ cat foo.txt
Words Here
paul $ 

Встроенный eval -может быть трудно использовать правильно, и я избегаю его использования везде, где это возможно. Ваша команда оценивается дважды (один раз как аргументы для eval, а затем сама eval ), что может сделать ваше цитирование трудным и утомительным (, особенно там, где задействован awk, где уже необходимы одинарные и двойные кавычки. )Кроме того, ошибки могут привести к тому, что ваши переменные будут выполняться как команды с непредвиденными последствиями. Подробнее здесь:

unix.stackexchange.com/questions/278427/why -и -, когда -следует -eval -использовать -следует -избегать -в оболочке --скрипты

Добавлен пример:

Одно предложение из ссылки на StackExchange, которую я разместил, состоит в том, чтобы оболочка создавала новый файловый дескриптор и сначала направляла его к цели.

Это несколько преувеличенный тестовый сценарий.

#! /bin/bash

#.. First arg to script is -l for test runs.

#.. For your live action.
Grafana="/dev/tcp/192.168.1.242/5062"

#.. For my demo here.
Grafana="./foo.txt"

rm -f foo.txt

if [[ "${1}" = "-l" ]]; then
    exec 7>&1
    shift 1
else
    exec 7>"${Grafana}"
fi  
 
vars="${@}" #.. Rest of args to output.

awk -v vars="$vars" 'BEGIN{printf "output.api %s \n", vars;}' 1>&7

ls -l foo.txt && cat foo.txt

И тест с записью в терминал, а потом в именованный файл/устройство.

Paul--)./Swit -l Easy Living
output.api Easy Living 
ls: cannot access 'foo.txt': No such file or directory
Paul--)./Swit Easy Living
-rw-r--r-- 1 paul paul 24 Aug 20 09:22 foo.txt
output.api Easy Living 
Paul--) 

Вы можете оставить fd 7 открытым и использовать его несколько раз в скрипте. Вы можете закрыть его с помощьюexec 7>&-

2
18.03.2021, 23:11

Теги

Похожие вопросы