Скрипт Bash для компакт-диска до каталогу з пробілами в імені шляху


95

Я використовую Bash на macOS X, і я хотів би створити простий виконуваний файл сценарію, який при запуску мінявся б на інший каталог. Однак шлях до цього каталогу містить пробіли. Як, чорт вазьми, ти це робиш? Це те, що я маю ...

Назва файлу: cdcode

Зміст файлу:

cd ~/My Code

Зараз надано, це не довгий шлях, але моє фактичне ім’я - це п’ять каталогів, і чотири з цих каталогів мають пробіли в шляху.

До речі, я спробував cd "~/My Code"і , cd "~/My\ Code"і ні один з них не працював.


1
Я маю подібну проблему, як описана. Тобто жоден із можливих способів змінити каталог, у якому є простір. Нічого подібного: cd "Мій паспорт" cd My \ Passport cd Мій "Паспорт" нічого не працює. Комплімент працює нормально. Я можу перерахувати: ls -l Мій \ Паспорт / працює нормально. \> uname -хост Linux 2.6.18-8.1.8.el5.centos.plus # 1 SMP пн липня 16 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --допомога GNU bash, версія 3.1 .17 (1) -випуск- (i686-redhat-linux-gnu) будь-які ідеї, будь ласка?
Denis C

Відповіді:


81

Коли ви двічі ставите лапки у шлях, ви зупиняєте розширення тильди. Отже, є кілька способів зробити це:

cd ~/"My Code"
cd ~/'My Code'

Тильда тут не вказана, тому розширення тильди все одно буде виконуватися.

cd "$HOME/My Code"

Ви можете розширити змінні середовища всередині рядків із подвійними лапками; це в основному те, що робить розширення тильди

cd ~/My\ Code

Ви також можете уникнути спеціальних символів (наприклад, пробілу) із зворотною рискою рискою.


3
Ви навіть могли б cd ~ / My '' Code, але це було б безглуздо, коли ви зможете уникнути цього за допомогою зворотної косої риски замість цього
Нік Діксон,

41

Я знайшов рішення нижче на цій сторінці :

x="test\ me"  
eval cd $x

Поєднання \в подвійних лапках текстової константи і evalперед cdробить це як шарм!


більше ясності: Для cd'ing до каталогу файлу сценарію: DIR = $ (ім'я "$ 0"); eval cd $ DIR
Майкл Скотт Катберт

1
Це справді допомогло мені запустити bash-скрипт на машині OS X. 🎉
timbillstrom

Тут насправді немає потреби eval.
Бенджамін В.

2
В OS X я не міг отримати інші / попередні відповіді на роботу без eval.
Д. Вудс,

10
cd ~/My\ Code

здається, це працює для мене ... Якщо скидання лапок, але збереження косої риски не працює, чи можете ви опублікувати зразок коду?


10

Ви можете використовувати будь-що з:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

Ви не можете використовувати:

cd ~"/My Code"

Перший працює, тому що оболонка розширюється ~ / в $ HOME /, а потім стикається з My Code без подвійних лапок. Другий не вдається, оскільки немає користувача, якого називають ' "' (подвійна лапка), для якого ~"потрібно зіставити.


9

Після боротьби з однією і тією ж проблемою, я спробував два різні рішення, які працюють:

1. Використовуйте подвійні лапки ( "") зі своїми змінними.

Найпростіший спосіб просто подвоїти ваші змінні в лапки, як вказано в попередній відповіді:

cd "$yourPathWithBlankSpace"

2. Скористайтеся eval.

Відповідно до цієї відповіді команди Unix для виходу з пробілів ви можете позбавити пробілу, а потім скористатися evalтаким чином:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

4

Для мене працює одна зворотна коса риса:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

Ви впевнені, що проблема полягає не в тому, що ваш сценарій оболонки змінює каталог у своїй підшерепці, але після цього ви повертаєтесь до основної оболонки (і оригінального каталогу) після закінчення? Я уникнув цього, використовуючи. для запуску скрипта в поточній оболонці, хоча більшість людей просто використовували б для цього псевдонім. Місцями може бути червоний оселедець.


Дякую, Ry4an (та решта респондентів). Здається, я виконував сценарій неправильно. Я просто намагався запустити його так:% ./cdsomedir Я не розумів, що мені потрібно використовувати "." щоб запустити сценарій так само, як і раніше:%. cdsomedir.sh Щойно я це зробив, це спрацювало. Помилка новачка. Дякую!


2

При роботі під Linux синтаксис нижче правильний:

cd ~/My\ Code

Однак, коли ви виконуєте свій файл, використовуйте синтаксис нижче:

$ . cdcode

(просто ".", а не "./")


З дикої цікавості, чому це важливо? Я лише коли-небудь бачив, що використовується..
whaley

./ породить нову оболонку, а потім змінить каталог. Отже, коли сценарій виходить, він повертається до оболонки, яка породила нову оболонку ... Ви опинитеся в каталозі, де ви виконали сценарій, замість ~ / My Code. '.' з іншого боку, сценарій виконується в поточному екземплярі оболонки.
Alterlife

Крапка "." є командою unix, псевдонімом для команди "джерело". Після нього слід вказати ім'я файлу. Отже, "source myfile" буде запускати файл у вашій поточній оболонці. І ". Myfile" зробить те саме. Змінна "./" означає "поточний каталог" і не є командою.
JPGConnolly

2

використовувати подвійні лапки

go () 
{ 
    cd "$*"
}

Дякую. Корисне доповнення до функцій у .bashrcфайлі для зміни каталогу під час вставки імен каталогів, що містять пробіли, у командний рядок, без необхідності потім уникати пробілів або цитувати все. cdsце краща назва.
mattst

Чи є спосіб розширити цей (без if) такий, який просто goбуде еквівалентний cd, тобто, cd до домашнього каталогу?
zennehoy

2

Дуже простий спосіб зробити це -

 $ cd My\ Folder

У bash запустіть команду DIR, і в результатах ви побачите, що імена папок або шляхів, що мають пробіл між ними, були записані в результатах наступним чином -

$dir
My\ Folder
New\ Folder

2

Це зробить це:

cd ~/My\ Code

Мені довелося це використовувати для роботи з файлами, що зберігаються на iCloud Drive. Ви не захочете використовувати подвійні лапки ("), оскільки тоді це повинен бути абсолютний шлях. Іншими словами, ви не можете поєднувати подвійні лапки з тильдою (~).

Як приклад, мені довелося використовувати це для недавнього проекту:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

Я сподіваюся, що це допоможе.


1

У мене була подібна проблема зараз, коли я використовував скрипт bash для скидання деяких даних. У підсумку я створив символічне посилання в папці скриптів без будь-яких пробілів. Потім я вказав свій сценарій на символічне посилання, і це чудово працює.

Щоб створити своє посилання. ln -s [ЦІЛЬОВИЙ ДИРЕКТОР АБО ФАЙЛ] ./ [СПОРТ]

Мау або може не бути корисним.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.