2016-05-10 9 views
0

Я бил головой, пытаясь создать эквивалент bash псевдонима csh. Довольно простой псевдоним в CSH является:Как создать эквивалент bash псевдонима csh, который задает переменную

alias gfiles='files="\`grep -l \\!*\`"; echo $files' 

В Баш псевдоним не будет работать из-за подстановки параметров и функция не будет работать, так как он должен установить переменную в родительской оболочке. Этот псевдоним позволяет вам использовать vi или ls или более соответствующие файлы. Эхо не совсем необходимо, но я нашел его полезным. Любая идея, как сделать эквивалент в bash?

+0

А? Функции абсолютно могут устанавливать переменные в вызывающих; они не работают в подпроцессах, если вы не делаете что-то, что заставляет это. –

+2

, который сказал, используя ** скалярную переменную ** (одну строку) для хранения ** списка ** имен файлов (каждая из которых является самой строкой) является чрезвычайно плохой практикой. Что произойдет, если нужно хранить имена с пробелами? Соответствующая практика заключается в использовании массива. –

ответ

2

Функции не выполняются дочерним элементом, поэтому они могут устанавливать переменные среды.

gfiles() { 
    files="$(grep -l "[email protected]")" 
    echo "$files" 
} 

(я не уверен, что делает ваш псевдоним;. Я подозреваю, что есть опечатка)

+0

Псевдоним - это попытка переписать псевдоним csh в bash. Таким образом, очищенный, целевой 'grep' внутри функции должен быть' grep -l $ * ', так как' \\! * 'Является синтаксисом csh для аргументов псевдонима csh –

+0

@CraigEstey: Ah, Ok. В этом случае правильная подстановка - «$ @», которая не перепишет аргументы. Благодарю. Отредактировал ответ. – rici