почему xargs не может получить аргумент

У меня есть несколько файлов sql, и я хочу сделать дамп в свою локальную базу данных, сначала я использовал эту команду оболочки, но она не работает

ls *.sql|xargs -i mysql -uroot -p123456 foo < {}
zsh: no such file or directory: {}

но ниже может работать

echo hello | xargs -i echo {} world
hello world

так почему первая команда не работает?


person zhuguowei    schedule 16.01.2016    source источник


Ответы (1)


Перенаправления обрабатываются оболочкой до запуска каких-либо команд. Если вы хотите, чтобы xargs обрабатывал перенаправление, вам нужно запустить подоболочку.

ls *.sql | xargs -i sh -c 'mysql -uroot -p123456 foo < {}'

Однако вам не следует использовать ls для управления сценариями. Ты хочешь

for f in *.sql; do
    mysql -uroot -p123456 foo <"$f"
done

или вполне возможно просто

cat *.sql | mysql -uroot -p123456 foo
person tripleee    schedule 16.01.2016