Вставить оператор if?

от man install :

-d, --directory
   treat all arguments as directory names; create all components of the specified directories

-D     
   create all leading components of DEST except the last, then copy SOURCE to DEST

Демонстрация:

  • install -d флаг:

     $ install -d foo bar 
     $ ls -l {{1 }} drwxr-xr-x 2 root root 6 сент. 8 15:55 foo 
    drwxr-xr-x 2 root root 6 сент. 8 15:55 bar 
     

Видите, было создано два каталога с именем foo & bar

  • install -D flag:

     $ touch test {1..3} 
     $ ls -l 
     -rw-r - r-- 1 корневой корень 0 8 сентября 16:11 test1 
     - rw-r - r-- 1 корневой корень 0 8 сентября 16:11 test2 
     - rw -r - r-- 1 root root 0 8 сентября, 16:11 test3 
     $ install -D test1 test2 test3 bar 
     $ ls -l bar / 
     - rw-r --r-- 1 корневой корень 0 8 сентября 16:11 test1 
     - rw-r - r-- 1 корневой корень 0 8 сентября 16:11 test2 
     - rw-r-- r-- 1 root root 0 8 сентября 16:11 test3 
     

Он скопировал файлы test1..3 в каталог bar

Заключение

Я не Думаю, install поддерживает копирование целых деревьев каталогов; обычно он используется для файлов. Возможно, вам потребуется использовать cp или rsync .

2
16.05.2017, 21:11
2 ответа

Чтобы скопировать стандартный ввод в стандартный вывод, используйте cat, а не echo.

git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
  then
    cat
  else
    cat > "$2"
fi

Обратите также внимание на правильное использование кавычек и размещение вертикальной черты, чтобы избежать обратной косой черты. Использование sed является очень незначительной оптимизацией, но я также нахожу его более понятным, чем двойное rev вокруг cut (при условии, что вы используете регулярное выражение grok). Вы также можете использовать awk -F/ '{ print $NF }' (но тогда для этого вам потребуется грокнуть Awk).

Вы можете избежать кота, сделав это вместо этого;

${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'

(Сбой, если вы передаете пустую строку в качестве второго аргумента, должен быть, по крайней мере, более явным, если не обязательно более полезным, чем с [ -z, который не может различить неустановленное и пустое значение.)

7
27.01.2020, 21:49

Вы можете просто заменить синтаксис {}, который вы пытаетесь использовать, на cat, поскольку вы пытаетесь читать из stdin:

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        cat
      else
        cat > $2
    fi

Обновить : подоболочка не нужна, спасибо @tripleee.

5
27.01.2020, 21:49

Теги

Похожие вопросы