Чи є гарною практикою вимагати прорізної косої риски в іменах каталогу?


9

Я хочу попросити користувача мого сценарію bash пройти шлях до каталогу в якості аргументу. Що з наведеного нижче є хорошою практикою програмування?

  • Потрібно, щоб користувач вводив пробіл / (косою рисою вперед)
  • Потрібно, щоб користувач не вводив пробіл / (косою рисою вперед)

3
Зауважте, що rsyncповодиться по-різному дуже важливо, залежно від наявності останнього /, і тому в деяких випадках ви хочете нормалізуватися для узгодженості, а в інших - вам слід пройти чисто, щоб реалізувати те, що сказав користувач (якщо вони знав, що вони розмовляють rsync).
sh1

Ще одне, що мене здивувало нещодавно, - це те, що ls -l dirповодиться інакше, ls -l dir/якщо dirце символьне посилання на каталог.
Flimm

Відповіді:


27

Найкращою практикою є припускати жодне.

Якщо у вас є доступ до утиліт / класів для побудови шляхів, використовуйте ці, якщо не запишіть свій код, щоб прийняти будь-який формат і діяти відповідно.

Користувача ніщо не дратує, ніж пам’ятати, додавати слід чи ні.


6
Слідство: Завжди розбирати шляху з відповідними інструментами командного рядка - dirname, basenameі readlink. Дуже поширеною проблемою є використання ${path##*/}в якості заміни basename, але якщо шлях закінчується косою косою, яка повертає порожній рядок замість останнього елемента шляху.
l0b0

1
+1 для використання корисних класів. Я не можу сказати, скільки разів я бачив, як розробники переосмислювали колесо, коли мова заходить про збірку шляхів, коли більшість фреймворків сьогодні це легко зробити.
RationalGeek

1
Також я сильно роздратований, коли якась програма вимагає від мене цього робити певним чином. І іноді користувач не може керувати тим, як записати цей шлях: Іноді вони записують його, тож тоді так, вони вирішують писати з або без косої риски, але у випадках, коли користувач автоматично завершує використання TAB, багато оболонок ставлять продільну косу рису, тож ви вимагаєте від користувача видалити його? І ще більше дратує те, коли програма поводиться інакше, якщо ви помістите rsync
кінцеву косу рису

Нещодавно мені потрібно було перевірити проміжок сліду з введення користувача для використання з rsync (оскільки він чутливий до цих речей). Як зазначав @ChrisF, найкращою практикою вважати це не можна. Я придумав таке, як витончений спосіб припускати жодне: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))я також задокументував це чітко для ясності: додавання або видалення сліду косої риси в баші
Джон Марк Мітчелл

10

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

cat /etc/hosts

такий же, як

cat /////etc//////////hosts

Отже, ваш сценарій може виглядати так:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

і вам не доведеться турбуватися, вводить чи ні користувач в контур / у шлях.


5
Ніт: Це не bashповедінка, ядро ​​це робить.
Blrfl

7

Покійний Джон Постель мав кілька чудових порад у розділі 3.2 RFC 760, які застосовуються тут:

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


3

Концептуально коса риса не є частиною назви. Нахил - це лише роздільник між іменами. Мій домашній реж / home / stefan, а не / home / stefan /.

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

a="/home"
b="stefan"

dir=$a/$b

0

Якщо вимагати, щоб у каталозі не було слішів, слід дуже дратувати інтерактивне використання консолі: автоматичне заповнення TAB автоматично додає косую рису для каталогів.

Тому вам, безумовно, потрібно дозволити, щоб каталоги були вказані з косою косою рисою.

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