2016-04-29 3 views
0

Я пытаюсь создать новую папку, дубликат ввода, а затем tar содержимое этой папки. Я не могу понять, почему - но кажется, что вместо того, чтобы искать содержимое моего вновь созданного каталога - это поиск весь мой компьютер ... возвращение линии, такие какдоступ к вновь созданной директории в сценарии оболочки

/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Sine - Vocal 1.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Sine - Vocal 2.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Arp.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Asym 4.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Eml.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square is a folder 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square/Square - Arp.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square/Square - Bl Saw.raw is a file 

вы, ребята заметили простую ошибку ?

BTW, я знаю, что сценарий до tar еще нет, но это будет легко, когда я смогу перейти в новую папку.

#!/bin/bash 

##--- deal with help args ------------------ 
## 

print_help_message() { 
    printf "Usage: \n" 
    printf  "\t./`basename $0` <input_dir> <output_dir>\n" 
    printf "where\n" 
    printf  "\tinput_dir : (required) the input directory.\n" 
    printf  "\toutput_dir : (required) the output directory.\n" 
} 

if [ "$1" == "help" ]; then 
    print_help_message 
    exit 1 
fi 

## ------ get cli args ---------------------- 
## 


if [ $# == 2 ]; then 
    INPUT_DIR="$1" 
    OUTPUT_DIR="$2" 
fi 


## ------ tree traversal function ----------- 
## 

mkdir "$2" 
cp -r "$1"/* "$2"/ 

## ------ return output dir name ------------ 
## 

return_output_dir() { 
    echo $OUTPUT_DIR/$(basename $(basename $(dirname $1))) 
} 


bt() { 
    output_dir="$1" 
    for filename in $output_dir/*; do 
     if [ -d "${filename}" ]; then 
      echo "$filename is a folder" 
      bt $filename 
     else 
      echo "$filename is a file" 
     fi 
    done 
} 

## ------ main ------------------------------ 
## 

main() { 
    bt $return_output_dir 
    exit 0 
} 


main 
} 
+0

Добавить к вопросу, как вы называете команду – sjsam

ответ

1

Ну, я могу вам сказать, почему он делает это, но я не ясно, о том, что он должен делать, так что я не знаю, как это исправить. Непосредственной проблемой является то, что return_output_dir является функцией, а не переменной, поэтому в команде bt $return_output_dir часть $return_output_dir расширяет до ... ничего, а bt запускается без аргументов. Это означает, что внутри bt, output_dir устанавливается в пустую строку, поэтому for filename in $output_dir/* становится for filename in /*, который выполняет итерации над элементами верхнего уровня на вашем загрузочном томе.

Есть целый ряд других вещей that're запутанным/странно об этом коде:

  • Функция main(), кажется, не служит никакой цели - некоторые из кода основной линии находится вне это (в частности, аргумент, разбирающий материал), некоторые внутри, без видимых причин. Наличие функции main требуется на некоторых языках, но в сценарии оболочки обычно имеет смысл просто поместить основной код в строку. (Кроме того, функции не должны exit, они должны return.)

  • У вас есть переменные с именами как OUTPUT_DIR и output_dir. Используйте разные имена. Кроме того, обычно лучше придерживаться строчных (или смешанных) имен переменных, чтобы избежать конфликтов с переменными, которые используются оболочкой и другими программами.

  • Вы копируете $1 и $2 в INPUT_DIR и OUTPUT_DIR, а затем продолжать использовать $1 и $2, а не более-четко названных переменных, которые вы только что скопировали их.

  • output_dir изменен в рекурсивной функции, но не объявлен как local; это означает, что внутренние вызовы bt будут изменять значения, которые внешние могут попытаться использовать, что приводит к странности. Объявите функции-локальные переменные как local, чтобы избежать проблем.

  • $(basename $(basename $(dirname $1))) не имеет смысла. Предположим, что $1 «/ foo/bar/baz/quux»: затем dirname $1 возвращает /foo/bar/baz, basename /foo/bar/baz возвращает «baz», а basename baz снова возвращает «baz». Второй basename ничего не делает! И в любом случае, я уверен, что все это не делает то, что вы ожидаете.

  • Какой каталог bt должен быть рекурсивно? Ничто в том, как вы его называете, не имеет никакого отношения ни к INPUT_DIR, ни к OUTPUT_DIR.

  • Как правило, вы должны поместить ссылки переменных в двойные кавычки (например, for filename in "$output_dir"/* и bt "$filename"). Вы делаете это в некоторых местах, но не в других.

+0

Привет, Гордон, спасибо за подробный ответ. Предполагается, что он рекурсирует через вновь созданный OUTPUT_DIR. –

+0

@VincentRodomista В этом случае я просто удалял 'main' и' return_output_dir' и помещал 'bt '$ OUTPUT_DIR" в конец скрипта (за исключением того, что вы должны изменить OUTPUT_DIR на другое имя). Кроме того, используйте [shellcheck.net] (http://www.shellcheck.net) - он поймает много основных ошибок для вас. –

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

  • Нет связанных вопросов^_^