Я пытаюсь написать небольшой скрипт, чтобы изменить текущий каталог на каталог моего проекта:
#!/bin/bash
cd /home/tree/projects/java
Я сохранил этот файл как proj, добавил разрешение на выполнение chmod
и скопировал его в /usr/bin
. Когда я называю это:,
proj
это ничего не делает. Что я делаю неправильно?
pwd
на последней строке. Поэтому, прежде чем сценарий закончится, вы можете проверить, работает он или нет ..cd
Команда хорошо работает внутри скриптов, попробуйте сами.cd
находится?Ответы:
Сценарии оболочки запускаются внутри подоболочки, и каждая подоболочка имеет свою концепцию текущего каталога.
cd
Успешно, но как только выходит подоболочка, вы снова в интерактивной оболочке и никогда ничего не изменилось там.Один из способов обойти это, вместо этого использовать псевдоним:
источник
. my-script
илиsource my-script
.Вы не делаете ничего плохого! Вы изменили каталог, но только внутри подоболочки, которая запускает скрипт.
Вы можете запустить скрипт в текущем процессе с помощью команды "точка":
Но я бы предпочел, чтобы Грег предложил использовать псевдоним в этом простом случае.
источник
.
также пишетсяsource
, выберите тот, который вы найдете более запоминающимся.cd
В сценарии технически работали , как он изменил каталог оболочки , который бежал сценарий, но это отдельный процесс раздвоенный из интерактивной оболочки.Совместимый с Posix способ решения этой проблемы состоит в определении процедуры оболочки, а не командного сценария, вызываемого оболочкой .
Вы можете просто напечатать это или поместить в один из различных файлов запуска оболочки.
источник
jhome(){ cd /home/tree/projects/$1; }
Это
cd
делается в оболочке скрипта. Когда сценарий заканчивается, оболочка завершается, и вы остаетесь в том каталоге, в котором находились. «Исходный» сценарий, не запускайте его. Вместо:делать
(Обратите внимание на точку и пробел перед именем скрипта.)
источник
source
myscript.sh
находится в каталоге, включенном в $ PATH, вы можете получить его из любого места без указания полного пути.Чтобы создать скрипт bash, который перейдет в выбранный каталог:
Создать файл скрипта
Затем создайте псевдоним в вашем файле запуска.
Например, создайте основной файл псевдонимов / функций: /scripts/mastercode.sh
(поместите псевдоним в этот файл.)
Затем в конце вашего файла .bashrc :
Теперь легко перейти в ваш каталог java, просто наберите cdjava, и вы уже там.
источник
mastercode.sh
не нуждается в shabang (#!/bin/sh
), поскольку он не выполняется (и не может быть выполнен) в подоболочке. Но в то же время вам необходимо документировать «вкус» оболочки этого файла; например, ksh или bash (или (t) csh / zsh и т. д.), и это почти наверняка не такsh
. Я обычно добавляю комментарий (но не шебанг), чтобы сообщить об этом; например, «этот файл предназначен для получения (из bash), а не запускается как сценарий оболочки».source
d (черезalias
), эти переменные попадут в вашу оболочку. Чтобы избежать этого, сделайте всю работу скрипта в функции и просто вызовите его в конце скрипта. Внутри функции объявите любые переменныеlocal
.Вы можете использовать
.
для выполнения скрипта в текущей среде оболочки:или, альтернативно, его более читаемый, но специфичный для оболочки псевдоним
source
:Это позволяет избежать подоболочки и позволяет любым переменным или встроенным функциям (в том числе
cd
) влиять на текущую оболочку.источник
Идея Джереми Рутена об использовании символической ссылки вызвала мысль, которая не нашла никакого другого ответа. Использование:
Ведущая толстая кишка важна; это означает, что если в текущем каталоге есть каталог 'dir', то '
cd dir
' изменится на него, а не прыгнет куда-то еще. С установленным значением, как показано, вы можете сделать:и, если в текущем каталоге нет подкаталога с именем java, он сразу приведет вас в $ HOME / projects / java - без псевдонимов, без сценариев, без сомнительных команд или точечных команд.
Мой $ HOME - это / Users / jleffler; мой $ CDPATH это:
источник
Используйте
exec bash
в концеОднако этот вопрос часто задают, потому что кто-то хочет остаться в (новом) приглашении bash в определенном каталоге после выполнения сценария bash из другого каталога.
Если это так, просто запустите дочерний экземпляр bash в конце скрипта:
источник
exit
вы вернетесь в оболочку, в которой вы запустили этот скрипт.Я получил свой код для работы с помощью
. <your file name>
./<your file name>
доза не работает, потому что она не меняет ваш каталог в терминале, она просто меняет каталог, специфичный для этого скриптаВот моя программа
Вот мой терминал
источник
. something
и./something
?? Этот ответ сработал для меня, и я не понимаю, почему.. something
позволяет запускать скрипт из любого места,./something
требует , чтобы вы находились в каталоге, в котором хранится файл.#!. /bin/bash
?просто запустите:
источник
Когда вы запускаете скрипт оболочки, он запускает новый экземпляр этой оболочки (
/bin/bash
). Таким образом, ваш скрипт просто запускает оболочку, меняет каталог и завершает работу. Другими словами,cd
(и другие подобные команды) внутри скрипта не влияют и не имеют доступа к оболочке, из которой они были запущены.источник
В моем конкретном случае мне нужно было слишком много раз переходить на один и тот же каталог. Итак, на моем .bashrc (я использую Ubuntu) я добавил
1 -
2-
3 -
Непосредственно это будет делать: cd / home / tree / projects / java
Надеюсь, это поможет!
источник
Вы можете сделать следующее:
РЕДАКТИРОВАТЬ: Это также может быть «пунктирной», чтобы предотвратить создание последующих оболочек.
Пример:
источник
exit
(или ctrl + d) несколько раз, чтобы выйти из оболочки, например. Псевдоним намного чище (даже если команда оболочки выводит каталог, и это cd к выводу - псевдоним что-то = "CDgetnewdirectory.sh
")Это только изменяет каталог для самого скрипта, в то время как ваш текущий каталог остается прежним.
Вы можете использовать символическую ссылку вместо этого. Это позволяет вам сделать «ярлык» для файла или каталога, так что вам нужно всего лишь напечатать что-то вроде
cd my-project
.источник
Вы можете комбинировать псевдонимы и точечные подходы Адама и Грега, чтобы сделать что-то более динамичное -
Теперь запуск псевдонима проекта будет выполнять сценарий проекта в текущей оболочке, в отличие от подоболочки.
источник
Вы можете объединить псевдоним и скрипт,
при условии, что скрипт повторяет путь назначения. Обратите внимание, что это обратные черты вокруг имени скрипта.
Например, ваш скрипт может быть
Преимущество этого метода заключается в том, что сценарий может принимать любое количество параметров командной строки и выдавать различные назначения, рассчитанные, возможно, сложной логикой.
источник
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(илиproj "foo bar"
<= в случае , если у вас есть пробелы) ... или даже (например):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> делаетcd
в/home/user/projects/java/a/b/c
для быстрой навигации по каталогам, есть $ CDPATH, cdargs и способы автоматической генерации псевдонимов
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
источник
В вашем файле ~ / .bash_profile. добавить следующую функцию
Перезапустите терминал, и вы можете ввести
и вы будете перемещены в папку назначения.
источник
Вы можете использовать оператор &&:
cd myDirectory && ls
источник
&&
если вы хотите, чтобы вторая была условной по отношению к первой, или просто с;
или новой строкой между ними), но вставив это в сценарий, вы вернетесь назад к «почему родительская оболочка не использует новый каталог, когда наcd
самом деле был успешным? "Хотя поиск сценария, который вы хотите запустить, является одним из решений, вы должны знать, что этот сценарий может напрямую изменить среду вашей текущей оболочки. Также невозможно передавать аргументы.
Другой способ сделать это - реализовать ваш скрипт как функцию в bash.
Этот метод используется autojump: http://github.com/joelthelion/autojump/wiki, чтобы обеспечить вас изучением закладок каталога оболочки.
источник
Вы можете создать функцию, как показано ниже,
.bash_profile
и она будет работать плавно.Следующая функция принимает необязательный параметр, который является проектом. Например, вы можете просто запустить
или
Вот определение функции.
Не забудьте найти свой источник
.bash_profile
источник
Это должно делать то, что вы хотите. Перейдите в каталог, представляющий интерес (из скрипта), а затем создайте новую оболочку bash.
Если вы запустите это, то вы попадете в интересующий каталог, а когда вы выйдете из него, вы вернетесь в исходное место.
Это даже приведет вас к исходному каталогу при выходе ( CTRL+ d)
источник
Через некоторое время, но я сделал следующее:
создать файл с именем case
вставьте в файл следующее:
сохраните это и затем:
Я также создал псевдоним в моем
.bashrc
:теперь, когда я печатаю:
по сути, я печатаю:
Вы можете напечатать любую папку после 'case':
что похоже на набор:
соответственно
В моем случае путь намного длиннее - эти парни суммировали его с информацией ранее.
источник
cd
В псевдониме является излишним и безвкусным; псевдоним должен просто ~ / case` вместо. Такжеcase
является зарезервированным ключевым словом, поэтому довольно плохой выбор для имени.Вам не нужен скрипт, только установите правильную опцию и создайте переменную окружения.
в вашем
~/.bashrc
позволяетcd
содержимое переменных среды.Создайте такую переменную среды:
и вы можете использовать:
Другие альтернативы .
источник
Если вы используете рыбу в качестве оболочки, лучшее решение - создать функцию. В качестве примера, учитывая исходный вопрос, вы можете скопировать 4 строки ниже и вставить их в командную строку вашей рыбы:
Это создаст функцию и сохранит ее для последующего использования. Если ваш проект изменяется, просто повторите процесс, используя новый путь.
Если вы предпочитаете, вы можете вручную добавить файл функции, выполнив следующие действия:
и введите текст:
и, наконец, нажмите Ctrl + X, чтобы выйти, а затем Y, чтобы сохранить изменения.
( ПРИМЕЧАНИЕ: первый метод использования funcsave создает для вас файл proj.fish ).
источник
У меня есть простой bash-скрипт p для управления сменой каталога на
github.com/godzilla/bash-stuff,
просто поместите скрипт в локальный каталог bin (/ usr / local / bin)
и вставьте
в вашем .bashrc
источник
Обратите внимание на обсуждение Как мне установить рабочий каталог родительского процесса?
Он содержит некоторые хакерские ответы, например https://stackoverflow.com/a/2375174/755804 (изменение каталога родительского процесса с помощью gdb, не делайте этого) и https://stackoverflow.com/a/51985735/755804 ( команда,
tailcd
которая внедряет dd-имя cd во входной поток родительского процесса; в идеале она должна быть частью bash, а не хаком)источник
Это старый вопрос, но я очень удивлен, что не вижу здесь этого трюка
Вместо использования CD вы можете использовать
Не нужно создавать подоболочки или использовать псевдонимы.
Обратите внимание, что вы должны убедиться, что / path / you / want существует.
источник
Как объяснено в других ответах, вы изменили каталог, но только внутри вложенной оболочки, которая запускает сценарий . это не влияет на родительскую оболочку.
Одним из решений является использование функций bash вместо сценария bash (
sh
); поместив код вашего bash-скрипта в функцию. Это делает функцию доступной как команду, и затем она будет выполняться без дочернего процесса, и, таким образом, любаяcd
команда будет влиять на оболочку вызывающей стороны.Bash функции:
Одной из особенностей профиля bash является хранение пользовательских функций, которые можно запускать в терминале или в сценариях bash, так же, как вы запускаете приложение / команды, это также можно использовать в качестве ярлыка для длинных команд.
Чтобы ваша система работала эффективно, вам нужно скопировать свою функцию в конце нескольких файлов.
Вы можете
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
редактировать / создавать эти файлы быстроКак :
Скопируйте код вашего bash-скрипта в новую функцию в конце файла профиля вашего bash и перезапустите ваш терминал, после чего вы сможете запустить
cdd
любую функцию, которую вы написали.Пример скрипта
Создание ярлыка для
cd ..
сcdd
лс ярлык
лс ярлык
источник
Вы можете выполнить несколько строк в одной и той же подоболочке, если заканчиваете строки обратной косой чертой.
источник