Используйте перенаправление вывода для изменения каталога

Я работал с BASH и использовал перенаправление вывода, чтобы сохранить путь к файлу. Когда я пытаюсь повторно использовать входные данные, хранящиеся в файле, с помощью перенаправления ввода, это не работает.

Я написал 2 функции: одна перенаправляет вывод, а другая перенаправляет ввод в команду cd.

#!/bin/bash



savepath () {


pwd > /home/user/Documents/save_path.txt

}

gotopath () {


cd < /home/user/Documents/save_path.txt

}

Сохраните сценарий оболочки и сделайте его исполняемым. Затем я использовал исходный код, чтобы позволить себе вызывать свои функции внутри оболочки.

После запуска первой savepath() и перехода в любой случайный каталог запуск второй функции должен отправить меня обратно в каталог, из которого я запустил savepath(). Он этого не делает, а отправляет меня в мой домашний каталог.

cd не использует STDIN.
Biffen 30.04.2024 09:09

Попробуйте cd -- "$(< /home/user/Documents/save_path.txt)".

user14548240 30.04.2024 09:10

Знаете ли вы, что инструкция pwd просто показывает значение переменной окружения $PWD? (Просто нажмите echo $PWD > /home/user/Documents/save_path.txt, чтобы сохранить путь)

Dominique 30.04.2024 09:38

Если вам нужно сохранить путь только на время работы скрипта, почему бы не сохранить его в переменной, а не в файле? saved_path=$PWD и cd -- "$saved_path" могут помочь. А еще есть встроенные функции pushd и popd для нажатия и открытия каталога.

Jens 30.04.2024 09:48

Вы передаете каталог cd в качестве входных данных, а не в качестве аргумента, но cd принимает только аргументы, а не входные данные. См. «Аргументы командной строки и ввод — в чем разница?» и «В чем разница между STDIN и аргументами, передаваемыми команде?»

Gordon Davisson 30.04.2024 09:51

Спасибо за объяснение. Я новичок, поэтому просто спотыкался, пытаясь заставить это работать.

sparky_101 30.04.2024 11:38

Вы, ребята, лучшие. Большое спасибо за помощь. Попробовал подход, предложенный Йенсом, и он сработал. Однако я был озадачен тем, что может быть причиной того, что перенаправление ввода не работает.

sparky_101 30.04.2024 11:48

Альтернативно, посмотрите xargs, чтобы преобразовать STDIN в аргументы командной строки.

Ljm Dullaart 30.04.2024 16:33

Как ни странно, я настроил функцию gotopath так, чтобы она выглядела так: cat /home/user/Documents/save_path.txt | xargs -t cd и она выдает следующую ошибку независимо от того, попробую ли я предложение Доминика или придерживаюсь оригинала: cd /home/x-ngin xargs: cd: Нет такого файла или каталога . Ребята, вы хоть представляете, что может быть не так, я безуспешно ломал голову? Я понимаю, что мы, вероятно, уже прошли точку убывающей отдачи, но я подумал, что это может помочь кому-то еще.

sparky_101 01.05.2024 11:57

конвейер (cmd1 | cmd2) выполняется в контексте подоболочки — изменения отбрасываются после его завершения, поэтому cd также отменяется. даже если вы запустите xargs, изменение не приживется

jhnc 01.05.2024 14:48
cd — встроенная оболочка. Было бы бессмысленно делать это отдельной программой; изменение каталога будет немедленно потеряно при выходе из программы. xargs говорит вам правду - такого файла или каталога не существует
jhnc 01.05.2024 14:52

Спасибо за объяснение @jhnc. Я думаю, мне нужно вернуться и узнать немного больше о том, как работает сама оболочка. Я определенно многому научился из этого.

sparky_101 02.05.2024 09:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

#!/bin/bash

SAVEPATH=$HOME/Documents/save_path.txt

savepath () {
    pwd > $SAVEPATH
}

gotopath () {
    cd `cat $SAVEPATH`
}

Исходная реализация пыталась передать сохраненный путь через stdin. cd работает не так: в качестве аргумента ему нужен целевой каталог. При таком подходе содержимое файла подставляется в качестве аргумента.

Большое спасибо за объяснение, датавуки. Он определенно не обращал внимания на детали того, что я делал - это было классическое вставление кода и надежда, что он заработает.

sparky_101 05.05.2024 17:48

Спасибо datawookie, принято должным образом. Все еще осваивая основы, я не понимал, что мне нужно это сделать.

sparky_101 06.05.2024 19:21

Другие вопросы по теме