Я работал с BASH и использовал перенаправление вывода, чтобы сохранить путь к файлу. Когда я пытаюсь повторно использовать входные данные, хранящиеся в файле, с помощью перенаправления ввода, это не работает.
Я написал 2 функции: одна перенаправляет вывод, а другая перенаправляет ввод в команду cd
.
#!/bin/bash
savepath () {
pwd > /home/user/Documents/save_path.txt
}
gotopath () {
cd < /home/user/Documents/save_path.txt
}
Сохраните сценарий оболочки и сделайте его исполняемым. Затем я использовал исходный код, чтобы позволить себе вызывать свои функции внутри оболочки.
После запуска первой savepath()
и перехода в любой случайный каталог запуск второй функции должен отправить меня обратно в каталог, из которого я запустил savepath()
. Он этого не делает, а отправляет меня в мой домашний каталог.
Попробуйте cd -- "$(< /home/user/Documents/save_path.txt)"
.
Знаете ли вы, что инструкция pwd
просто показывает значение переменной окружения $PWD
? (Просто нажмите echo $PWD > /home/user/Documents/save_path.txt
, чтобы сохранить путь)
Если вам нужно сохранить путь только на время работы скрипта, почему бы не сохранить его в переменной, а не в файле? saved_path=$PWD
и cd -- "$saved_path"
могут помочь. А еще есть встроенные функции pushd
и popd
для нажатия и открытия каталога.
Вы передаете каталог cd
в качестве входных данных, а не в качестве аргумента, но cd
принимает только аргументы, а не входные данные. См. «Аргументы командной строки и ввод — в чем разница?» и «В чем разница между STDIN и аргументами, передаваемыми команде?»
Спасибо за объяснение. Я новичок, поэтому просто спотыкался, пытаясь заставить это работать.
Вы, ребята, лучшие. Большое спасибо за помощь. Попробовал подход, предложенный Йенсом, и он сработал. Однако я был озадачен тем, что может быть причиной того, что перенаправление ввода не работает.
Альтернативно, посмотрите xargs
, чтобы преобразовать STDIN в аргументы командной строки.
Как ни странно, я настроил функцию gotopath так, чтобы она выглядела так: cat /home/user/Documents/save_path.txt | xargs -t cd
и она выдает следующую ошибку независимо от того, попробую ли я предложение Доминика или придерживаюсь оригинала: cd /home/x-ngin xargs: cd: Нет такого файла или каталога . Ребята, вы хоть представляете, что может быть не так, я безуспешно ломал голову? Я понимаю, что мы, вероятно, уже прошли точку убывающей отдачи, но я подумал, что это может помочь кому-то еще.
конвейер (cmd1 | cmd2
) выполняется в контексте подоболочки — изменения отбрасываются после его завершения, поэтому cd
также отменяется. даже если вы запустите xargs
, изменение не приживется
cd
— встроенная оболочка. Было бы бессмысленно делать это отдельной программой; изменение каталога будет немедленно потеряно при выходе из программы. xargs
говорит вам правду - такого файла или каталога не существует
Спасибо за объяснение @jhnc. Я думаю, мне нужно вернуться и узнать немного больше о том, как работает сама оболочка. Я определенно многому научился из этого.
Попробуй это:
#!/bin/bash
SAVEPATH=$HOME/Documents/save_path.txt
savepath () {
pwd > $SAVEPATH
}
gotopath () {
cd `cat $SAVEPATH`
}
Исходная реализация пыталась передать сохраненный путь через stdin
. cd
работает не так: в качестве аргумента ему нужен целевой каталог. При таком подходе содержимое файла подставляется в качестве аргумента.
Большое спасибо за объяснение, датавуки. Он определенно не обращал внимания на детали того, что я делал - это было классическое вставление кода и надежда, что он заработает.
Спасибо datawookie, принято должным образом. Все еще осваивая основы, я не понимал, что мне нужно это сделать.
cd
не использует STDIN.