Чи слід використовувати косу рису в кінці змінних контурів у сценарії оболонки чи ні? [зачинено]


11

Сьогодні при написанні мого сценарію оболонки.

Питання раптом приходить мені в голову.

Оскільки cd /target_dirі те і cd /target_dir/інше працює.
Чи слід додати косу рису в кінці моїх змінних шляху в сценарій оболонки?
Такі, як LOG_PATH=/data/nginx/logsпроти LOG_PATH=/data/nginx/logs/.

Я кілька пошукав у Google, але не знайшов обговорення з цього приводу, можливо, це занадто просто?

Наразі мені справді важко вирішити, який стиль вибрати.
Але я віддав перевагу LOG_PATH=/target_dir/стилю трохи більше.
Тому що, коли я роблю автодоповнення bash, це підскакує мені результат з косою рискою.

Яка ваша думка з цього приводу?


1
відповідне: чи має
зміна контуру

Правила немає. Обидва стилю кодування мають деякі переваги та певний недолік.
andcoz

Відповіді:


9

Відповідно до POSIX:

Визначення назви шляху:

Рядок, який використовується для ідентифікації файлу. Він має необов'язкові символи початку <slash> , а потім нульові або більше імен файлів, розділені знаками <slash> . Ім'я шляху може необов'язково містити один або кілька символів, що знаходяться в кінці <slash> . Кілька послідовних символів <косою рискою> вважаються такими ж, як один <косою> , за винятком випадків, коли два точно провідні знаки <коса коса » .


@ Цікаво, що я можу CD //і /з їх назвою показувати по-різному в підказці bash, і за допомогою pwdя отримаю різні шляхи показали, але їх зміст однаковий! Чому?
Дзен


1
Тому що bashвідслідковує поточний каталог дуже наївно, як рядок. Він просто додає та видаляє з контуру евристично, він не посилається на фактичну файлову систему. Одним із наслідків є те, що ви можете вступити в символічне посилання і повернутися тим самим способом (якщо баш не вирішив, це було занадто багато і повторно реалізувати його). Інше - це те, що ви описуєте. Не слід покладатися на відстеження оболонки поточного каталогу, це ненадійно.
orion


6

Щоб бути на безпечній стороні, включіть косу рису. Це може призвести до декількох косих рисок при об'єднанні шляхів, але принаймні ви уникнете проблем.

Кілька прикладів: rsyncтрактує шляхи по-різному, якщо включений треш-косий рисок (він синхронізує цей каталог замість того, щоб робити ще один підкаталог). Символічні посилання на каталоги іноді поводяться несподівано, коли у них немає останньої косої риски - принаймні, завершення оболонки плутається. Ви ніколи не знаєте, чи покладається команда / скрипт, на який ви посилаєтесь, перевірити наявність косої риски на якусь особливу поведінку. Це навіть може врятувати вас від чогось перезапису. Наприклад, якщо у вас є названий файл foo, але ви помилково думаєте, що це каталог і хочете щось перенести в нього, тоді mv bar fooбуде перезаписаний файл (втрата даних, потенційна катастрофа), але mv bar foo/буде просто скаржитися і нічого не робити.

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


2

Ні, не слід. Це додає додатковий непотрібний нахил ( /).

приклад

скажімо, що ви хочете експортувати binкаталог java у свою PATHзмінну,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

тепер перевірте це,

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

помічайте додаткову косу рису ( /) перед Java, але, на щастя, вона просто працює в такому випадку.


Я побачив, що в цьому посиланні є відповідь на 31 голос, в якій автор думає, що ми повинні додати косу рису. Я збентежений. stackoverflow.com/questions/980255/…
Дзен

@Zen, так, я перевірив це, це був перший коментар вашого запитання. Спасибі.
Арнаб

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