2015-04-09 2 views
1

у меня есть немного и, вероятно, очень глупый вопрос ..Передача Баш аргумент в виде строки

Я пытаюсь сделать псевдоним для гудрона и Gzip, который использует имя файла (с учетом в качестве аргумента), но не преобразовывая, как ожидалось, в имя файла на выходе.

Мой псевдоним:

alias targz='tar -cvzf $1.tar.gz $1' 

Он работает, но аргумент хранится в $ 1 не работает при установке файла, он застегивает его в файле с именем «.tar.gz».

Я пробовал просто эхом «$ 1.tar.gz», а выход «.tar.gz», поэтому я думаю, что это должно быть что-то очень глупое в формате.

Любая помощь приветствуется,

+2

Вам нужны функции для этого (или скриптов). Псевдонимы не будут делать. – PSkocik

ответ

4

Псевдонимы не имеют позиционные параметры. Они в основном макросы (псевдоним заменяется текстом псевдонима, когда он выполняется).

Вы можете использовать функцию:

targz() { 
    tar -cvzf "$1".tar.gz "$1" 
} 

или сценарий

#!/bin/bash 
tar -cvzf "$1".tar.gz "$1" 

Лично я использую что-то вроде следующего сценария для достижения тех же целей (комментарии добавлены для вашего удобства):

#!/bin/bash 
#support multiple args 
for arg in "[email protected]" 
do 
    #strip ending slash if present (tab-completion adds them) 
    arg=${arg%/} 
    #compress with pigz (faster on multicore systems) 
    tar c "$arg" | pigz - > "$arg".tgz 
done 

Если вы хотите, чтобы моя полная версия, я также удаляю аргумент directc Тори, если смолка и сжатие удастся (подобно тому, что делает GZIP для отдельных файлов)

#!/bin/bash 
set -o pipefail 
for arg in "[email protected]" 
do 
    arg=${arg%/} 
    tar c "$arg" | pigz - > "$arg".tgz && rm -rf "$arg" 
done 

Update: Кредиты @ mklement0 для более емким и более эффективной зачистки окончание слэш.

+0

Что означают слова «Псевдонимы не имеют позиционных параметров»? Я сделал псевдонимы, используя позиционные параметры, и они работают нормально. – Ghost

+1

@Ghost: Из раздела [bash man, раздел «Псевдонимы»] (https://www.gnu.org/software/bash/manual/bash.html#Aliases): «Механизм использования аргументов в заменяющем тексте отсутствует , как в csh. Если необходимы аргументы, следует использовать функцию оболочки (см. раздел «Функции оболочки»). –

+0

У меня в настоящее время есть псевдоним, который берет первый pos. параметр и изменяет адрес mi ethernet mac на него, и он работает. – Ghost

1

Используйте псевдоним для функции для него, что-то вроде:

alias targz='function targz_() { tar -cvzf "$1.tar.gz" "$1"; return 0; }; targz_ ' 
+1

В чем преимущество наличия псевдонима? Почему бы просто не использовать функцию «targz»? – John1024

+1

Чтобы показать OP, что есть способ имитировать позиционные параметры внутри 'alias' – higuaro

+1

Кажется, что это немного академическое упражнение, но, ОК, +1. – John1024

0

Попробуйте сделать сценарий для этого, как это.

echo """ 

#!/bin/bash if [ -z $1 ]; then 
    echo "Variable is Null" 
else 
    tar -cvzf $1.tar.gz $1 
fi 

""" > /usr/local/bin/targz 

chmod +x /usr/local/bin/targz 
+0

'echo" "" ... "" "" это то же самое, что 'echo" ... "', и в качестве строки с разделителем _double_ он мгновенно подвергается (определенным) расширениям оболочки, которые вы НЕ хочу здесь. используйте 'echo '...''. – mklement0

+0

Кроме того, не дублирование экземпляров '$ 1' означает, что скрипт будет разбит на аргументы со встроенными пространствами. – mklement0

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