2015-05-21 3 views
0

Я пишу скрипт для загрузки и установки Raspbian на флешку. Когда я запускаю его в терминале с корневым доступом, он завершает весь вывод на экран (раздражает). Когда я беру команду, что она запущена и запускает ее в терминале, я получаю мой индикатор выполнения, который я хочу.конвейер в сценариях дамп в stdout (или stderr) вместо отображения вывода pv

Есть ли что-то, что мне нужно знать о кошке, работающем в терминале? Я запускаю это на Mac.

(Обратите внимание, большая часть моей проблемы в последнем абзаце)

#!/bin/bash 
# Check to see if raspbian exists on hard drive 
ls *raspbian*.img >/dev/null 2> /dev/null 
if [ "$?" -eq "1" ]; then 
    # file not found 
    raspbianFileName='raspbian.img' 
else 
    # file found 
    raspbianFileName=$(ls *raspbian*.img | head -n1) > /dev/null 
fi 


if [[ -e $raspbianFileName ]]; then 
    echo "Raspbian found in $raspbianFileName" 
else 
    # the file does not exist 
    echo -e "Raspbian not found. Download? \c" 
    read shouldDownload 
    case "$shouldDownload" in 
    Y|y|yes|Yes|YES) # regex for anything starting with Y 
     echo "Attempting to download..." 
     downloadURL='downloads.raspberrypi.org/raspbian_latest' # needs redirects 
     curl -L downloads.raspberrypi.org/raspbian_latest -o 
     CURLcode=$? 
     if [ "$CURLcode" -eq "0" ]; then 
     echo "Download successful" 
     else 
     echo "File download not successfully." 
     echo "Curl returned code $CURLcode. For more details type 'man curl'" 
     exit 1 # exit this program with error code 1 
     fi 
     # Attempt to unzip the file 
     $raspbianDownloadFileName = ls 
     unzip "$raspbianDownloadFileName" 
     mv *.img "$raspbianFileName" 
     # TODO: Check success in script 
     # TODO: Check to see if unzip exists on system and propose alternatives (Linux doesn't have I know) 
     ;; 
     N|n|no|No|NO) # regex for anything starting with N 
     echo "Aborting install" 
     exit 3 # exit program with exit status 3. TODO: Ask user for other file 
     ;; 
    esac 

fi 

ls -lh $raspbianFileName # for verification 

echo -e "Is this the correct file? \c" 
read correctFile 
case $correctFile in 
    Y|y|yes|Yes|YES) 
    echo "Using $raspbianFileName" 
    ;; 
    N|n|no|No|NO) 
    echo -e "Enter full path to raspbian.img: \c" 
    read raspbianFullPath 
    if [[ -e $raspbianFullPath ]]; then 
     echo "Raspbian found in $raspbianFullPath" 
    else 
     echo "Raspbian not found. Try running script again." 
     exit 2 # exit program with exit status 2. 
    fi 
esac 

# We now assume that the raspbian image is at $raspbianFullPath 

echo ' 
Please select a disk from the following output to write raspbian to. Be warned 
that this will OVERWRITE all data on the disk. Check and double check. 

Note, the name should be (example) /dev/disk1, not /dev/disk1s1 for MacOS, 
and (example) /dev/sdb, not /dev/sdb1 for Linux.' 

diskutil list #this has been texted only on MacOS, not on Linux 

echo -e "Disk identifier?: \c" 
read diskname 

# Fix diskname for common errors 
diskname=$(echo $diskname | sed -e 's/\(disk[0-9]\)s[0-9]/\1/g') 
diskname=$(echo $diskname | sed -e 's/\(sd[a-z]\)[0-9]/\1/g') 
diskname=$(echo $diskname | sed -e 's/\(\/dev\/\)*\(.*\)/\/dev\/\2/g') 

if hash pv 2>/dev/null; then 
    filesize=$(wc -c "$raspbianFileName" | cut -f2 -d' ') 
    command="pv $raspbianFileName | dd of=$diskname bs=1m " 
    command="cat $raspbianFileName>/dev/null 2>/dev/null | pv -s $filesize 2>/dev/null | sudo dd of=$diskname bs=1m" 
# command="dd if=$(pwd)/$raspbianFileName bs=1m of=$diskname" 
else 
    command="dd if=$(pwd)/$raspbianFileName bs=1m of=$diskname" 
fi 

# check if running as root 
if [ "$EUID" -ne 0 ]; then 
    echo "Type or copy/paste the following command." 
    echo -e "Note, (On some systems running coreutils you may need '1M' instead of '1m')\n" 
    echo sudo $command 
elif [ "$EUID" -eq 0 ]; then 
    echo "Unmounting $diskname..." 
    diskutil unmountDisk "$diskname" 
    echo $command 
    sleep 2 
    $command 
fi 

exit 0 # exit this program with error code 0 (success) 
+0

Проблема не является исключительно кошкой, это также происходит, когда первая командная строка во втором и последнем абзаце также перезаписывается. –

+0

Довольно уверенная проблема в команде pv, потому что, когда я кодирую ее без dd или cat, у меня все еще возникают проблемы. –

+0

Я обнаружил, что если я делаю $ command>/dev/null, который исправляет его, но тогда pv жалуется, что он ничего не может найти –

ответ

0

Размещая eval перед $ команды, все, казалось, прекрасно работать. Теперь можно просмотреть код here on github