знак доллара внутри строки eval в bash

Способ Linux для проверки блокировки: sudo hdparm -I / dev / sdX (с X = a..z; необходимо конечно знать, какое у вас устройство). В конце (большого) вывода вы ДОЛЖНЫ иметь возможность прочитать в последних 10 строках: * not * locked .

0
12.12.2018, 10:21
1 ответ

Не пытайтесь запускать команды, хранящиеся в переменных (, если это не просто имя команды и/или путь ). Это обречено на неудачу интересными способами, если вы не получите правильное цитирование (, которое может быть неудобным и привести к менее надежному коду ).

В вашем случае достаточно

cd "/rbyoko/$c/\$Ono.RCB"

т. е. укажите путь к каталогу (, чтобы разрешить $cиметь пробелы ), а затем избежать $.

В качестве альтернативы:

cd "/rbyoko/$c"/'$Ono.RCB'

т. е. одинарная кавычка бита со знаком доллара, чтобы защитить его от оболочки.

Ваша функция изменена:

visit_tree_recbin () {
    for dir in c d h l o t p w; do
            cd "/rbyoko/$dir"/'$Ono.RCB'
            printf 'We are now in %s\n' "$PWD"
    done
}

Как вариант,

visit_tree_recbin () {
    for dirpath in /rbyoko/[cdhlotpw]/'$Ono.RCB'/; do
            cd "$dirpath"
            printf 'We are now in %s\n' "$PWD"
    done
}

Разница в том, что первый вариант создает пути к каталогам и cdв них. Это может завершиться ошибкой, если каталог не существует.

Второй вариант использует шаблон подстановки имен файлов, который соответствует существующим каталогам. Если шаблон соответствует чему-либо, cdпреуспеет (, если у вас есть разрешение cdв каталог ).

Обратите внимание, что bashподдерживает переменную PWD, которая содержит путь к текущему рабочему каталогу, поэтому нет необходимости использовать здесь pwd.

1
28.01.2020, 04:07

Теги

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