Створіть інший ярлик `~~` як `~` (домашній каталог)


10

Я хочу ~~вказати на інший каталог, щоб я міг використовувати його як ярлик. Я хочу, щоб він мав абсолютно такі ж функції, як і ~. Як я можу це зробити?


2
Можливо, вам буде краще з zsh назвами каталогів
Michael Mrozek

Щойно знайшов цікаве рішення проблеми superuser.com/a/565825/398328
VarunAgw

1
@VarunAgw haha, Смішно знайти, правильно, як я думав про те саме рішення. Сором. Я подумав, що на хвилину я був унікальним метеликом :(
Gravy

Відповіді:


14

Насправді спосіб є, це не чудовий спосіб, але це спосіб, ха-ха!

Додайте у /etc/passwdфайл наступне :

~:x:1111:99:special Character user:/test:/sbin/nologin

замініть 1111як UID чимось, що має сенс, замініть /testкаталог, який потрібно ~~ імітувати.

99у моїй системі - це nobodyгрупа, яку я рекомендую, якщо ви робите це, щоб переконатися, що це група без дозволів на будь-який файл, який коли-небудь звикне. Теоретично, /sbin/nologinяк оболонку, вона не може бути використана, вона також не буде мати /etc/shadowзапис, щоб не мати пароля. Теоретично має бути добре, але переконайтеся, що це якось не дозволяє вам увійти як обліковий запис.

Як зауваження: я жодним чином не кажу, що це гарна ідея, але вона забезпечить функціонал, який ви хочете.

EDIT: Для повноти це було запропоновано VarunAgw: Ви можете додати користувача в звичайному режимі з , useradd -s /sbin/nologin -N tmpа потім змінити /etc/passwdі /etc/shadowзмінити користувача tmpдо ~і змінити розташування зhome directory


Замість того щоб змінювати UID і GID, ми можемо просто useradd 'tmp'і замінити tmpз~
VarunAgw

Правда. гарна пропозиція. Я не впевнений, як я ставлюсь до легітимізації цього shadowзапису, але я гадаю, що поки не встановлено пароль, це насправді не є додатковим ризиком.
Гравий

8

Ви можете використовувати CDPATH і помістити каталог, буквально названий ~~ в одному з ваших компонентів CDPATH.

З man bash(але CDPATH доступний навіть у sh)

Шлях пошуку для команди CD. Це розділений двокрапкою список каталогів, в яких оболонка шукає каталоги призначення, вказані командою cd. Вибірковим значенням є ".: ~: / Usr".

Це дозволить вам зробити cd ~~.

Якщо ви хочете робити такі речі, як vi ~~/someFileз будь-якого місця в дереві каталогів, вам не пощастить, якщо ви наполягаєте ~~буквально, якщо ви не зламаєте свою оболонку, однак ви можете використовувати змінні чи змінну середовища для зберігання ваших магічних каталогів, щоб ви могли робити , наприклад,$tilda/someFile

Зазвичай я розміщую файли, які часто отримують доступ, до коротко названих каталогів у своєму домашньому каталозі, щоб я мав доступ до них шляхом, наприклад, ~/bабо ~/l.

Природно, ви зазвичай можете замінювати каталоги символьними посиланнями на каталоги скільки завгодно.


1

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

Тому:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

Я $HOMEвесь час змінюю і зберігаю функцію у файлі оточення моєї оболонки для її скидання:

home(){
    HOME=~$USER
    cd ~; pwd
}

Якщо ви хочете використовувати ~тильду таким чином, який не посилається на ваш домашній каталог, тоді зробіть це . Просто перепризначте $HOME. Не бійтеся цього. $HOMEє просто змінною оболонки, як і будь-яка інша.


Ще одна пропозиція, яку я маю - це лише незначне розширення щодо чудової поради @ PSkocik щодо використання $CDPATH. Однак, він не згадав про те, що ви можете використовувати та змінювати $CDPATHвбудований текст, не змінюючи поточного значення оболонки $CDPATH. Наприклад:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

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


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

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2

0

Відмінно працює як функція bash:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

Ось ще один підхід, який трохи ближче (я знаю, я не наближаюся до вимог)

function ~~ { echo /test; }

Потім ще з парою символів:

cd `~~`/subdir
vi `~~`/file

2
Ну, cd ~~/foo/barне буде працювати так добре, або vim ~~/foo.txt, і т.д. ...
derobert,

1
Питання незрозуміле. Якщо це бажане використання, я б використовував CDPATHзмінну для обробки cdсправи.
glenn jackman

Погодьтеся, це не зовсім зрозуміло, але ОП вимагає, щоб воно працювало так ~. І ~не використовується як команда.
дероберт

Я вважав себе цілком зрозумілим, якщо не повністю прописано. Проблема в CDPATHтому, що він не працює для команд поза .... CD. IE ви могли cd ~~або cd ~~/testdir1не можетеvim ~~testdir1
Gravy

ви можете зробити краще з псевдонімом, який викликає функцію. якalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.