LINUX.ORG.RU

[Bash] Quoting and escaping

 


0

1

Есть пример:

#!/bin/bash -x

action ()
{
   eval "${@:4}"
}

act ()
{
   action 0 2 2 "$@"
}


func ()
{
   pushd "$1"
   eval "$2"
   eval "$3"
   popd
}

act func /tmp/ "ls -Al > temp.txt" "cp -fv ./temp.txt $HOME"
act echo OK
act "{ echo OK1; echo OK2; }"

И он не работает. Знаю, что можно заставить его работать как надо, если заменить строки
 "ls -Al > temp.txt", "cp -fv ./temp.txt $HOME" на "'ls -Al > temp.txt'", "'cp -fv ./temp.txt $HOME'".
Но это похоже на хак, а не решение проблемы.
Вопрос заключается в том, есть ли выработанными десятилетиями упорного труда программерской мысли подход к решению таких ситуаций?



Последнее исправление: dimorphus (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это несомненно, верно. Моя вина в том, что я составил такой пример, в котором это возможно.
Пример обновил.

dimorphus
() автор топика

Нет. Многократное (>1) раскрытий строк — головная боль или просто ад.

Зачем тебе это надо? *sh — клей для простых действий, если тебе нужны такие манипуляции с командами, то тебе нужен не shell, а др. язык.

sdio ★★★★★
()
Ответ на: комментарий от Slavaz

Да я, в общем, знаю что это работает, о чём и сообщил c первых версий вопроса. Мне хотелось другого решения, так как в этом случае и оно не срабатывает:

#!/bin/bash -x

action ()
{
   eval "${@:4}"
}

act ()
{
   action 0 2 2 "$@"
}


func ()
{
   pushd "$1"
   eval "$2"
   eval "$3"
   popd
}


ARG2='ttttt'
FILE='temp.txt'
ARG="cat ./test.txt | sed -e 's|#MOUNTPOINT#|/|' -e 's|#KERNEL#|$ARG2|' > $FILE"

act func /tmp/ "'$ARG'" "'cp -fv $FILE $HOME'" || exit 1
act echo OK
act "{ echo OK1; echo OK2; }"

dimorphus
() автор топика
Ответ на: комментарий от dimorphus

потому что кавычки теряются после второго eval'а Это баш их убирает. Поэтому дополнительон надо экранировать.

Slavaz ★★★★★
()
Ответ на: комментарий от dimorphus

Разобрался:

- ARG="cat ./test.txt | sed -e 's|#MOUNTPOINT#|/|' -e 's|#KERNEL#|$ARG2|' > $FILE"
+ ARG="cat ./test.txt | sed -e \"s|#MOUNTPOINT#|/|\" -e \"s|#KERNEL#|$ARG2|\" > $FILE"

dimorphus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.