Відчуваю себе як ідіот прямо зараз. Чому це не працює?
echo "/some/directory/path" | xargs -n1 cd
Відчуваю себе як ідіот прямо зараз. Чому це не працює?
echo "/some/directory/path" | xargs -n1 cd
Відповіді:
Труба виконує xargs у підпроцесі, а xargs виконує cd у підпроцесі. Зміни підпроцесу не поширюються на батьківський процес.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Зверніть увагу, що я додав "вирізати", щоб розділити на пробіли і схопити перший елемент так, як це робить xargs)
xargs
не можна запускати, cd
оскільки це, обов`язково, вбудована оболонка і xargs
може запускати лише стоячі виконувані файли. Однак ви сказали, що це стосується підпроцесів.
cd `port file libcudd | sed -e 's/\/Portfile//'`
(як правило, довгі, з якими ви не хочете обробляти вручну, як, наприклад, це місце розташування портфайлів MacPorts).
Команда cd
є вбудованою, оскільки інформація про поточний каталог пов'язана з процесом, і лише вбудована оболонка може змінювати поточний каталог запущеної оболонки.
У коді є дві проблеми:
xargs
не може запускатися, cd
оскільки cd
це вбудована команда і xargs
може запускати лише виконувані файли.cd
в підпроцесі, викликаному з xargs
, це не матиме жодного впливу на батьківський процес, як пояснено вище.Рішення полягає в запуску підколон, всередині нього запустіть, cd
і тоді ви можете виконувати команди в новому поточному каталозі.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
в цьому прикладі. Це має бути перехідним значенням $0
, наприклад,echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'