от 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
.
Чтобы скопировать стандартный ввод в стандартный вывод, используйте 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
, который не может различить неустановленное и пустое значение.)
Вы можете просто заменить синтаксис {}
, который вы пытаетесь использовать, на cat
, поскольку вы пытаетесь читать из stdin
:
git ls-remote $1 'refs/heads/*' \
| rev \
| cut -d'/' -f1 \
| rev \
| if [ -z $2 ]
then
cat
else
cat > $2
fi
Обновить : подоболочка не нужна, спасибо @tripleee.