2012-01-12 4 views
2

Я пытаюсь изменить некоторый экспорт. Я понимаю, что этот код не работает, потому что его тело выполняется в подоболочке, но как его исправить?Экспорт из трубопровода в петлю в Bash?

export | sed 's/gcc.4.2/gcc64/g' | while read line; do $line; done 
+0

Вы хотите изменить экспорт, а затем снова задать переменную окружения? Если да, то вам нужно перенаправить вывод в другой файл, а затем загрузить файл – Raghuram

+0

@ Raghuram: Да ... нет способа сделать это из BASH? – Mehrdad

ответ

1

Файл, вероятно, является лучшим решением:

export | sed 's/gcc.4.2/gcc64/g' > ~/tmp/file 
. ~/tmp/file 

, но в случае, если вы хотите, чтобы избежать создания временного файла

eval $(export | sed 's/gcc.4.2/gcc64/; s/$/;/') 

должен сделать трюк.

+0

Это будет работать с другими раковинами, такими как Bourne и Korn (дайте или возьмите '~' для оболочки Bourne). Это, вероятно, не оптимально для 'bash', учитывая различные дополнительные трюки, которые у него есть в рукаве, в частности замена процесса. –

2

Вы можете сделать это без необходимости временного файла и я высоко препятствовать использованию eval как вы открыть свою систему для всех видов проблем безопасности с ним.

while read -r line; do $(sed -n 's/gcc.4.2/gcc64/gp' <<<"$line"); done < <(export) 

Кроме того, с помощью sed -n, это экспортирует только те записи, которые SED изменились.

5

За счет расположения для текущей оболочки читать команды с «процесса замещения»:

. <(export | sed 's/gcc.4.2/gcc64/g') 

Или:

source <(export | sed 's/gcc.4.2/gcc64/g') 

(который является более заметным, хотя и не столь кратким, как . команда).

+0

+1 хотя 'sed -n 's/gcc.4.2/gcc64/gp'' будет более эффективным. – SiegeX

+0

Установка только того, что нужно установить - да, это было бы более эффективно. Это не совсем то же самое, что и оригинал, но он соответствует намерению оригинала. –

Смежные вопросы