Создайте еще один ярлык `~~`, как `~` (домашний каталог)

10

Я хочу ~~указать на другой каталог, чтобы использовать его в качестве ярлыка. Я хочу, чтобы он имел точно такие же функциональные возможности, что и ~. Как я могу это сделать?

VarunAgw
источник
2
Вы могли бы быть лучше с zsh именованных каталогов
Майкл Мрозек
Просто нашел интересное решение проблемы superuser.com/a/565825/398328
VarunAgw
1
@VarunAgw хаха, забавная находка, как я и думал о том же решении. Позор. Я думал, что я уникальная бабочка на минуту :(
Соус

Ответы:

14

На самом деле, есть способ, это не отличный способ, но это путь, ха-ха!

Добавьте следующее в ваш /etc/passwdфайл:

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

замените в 1111качестве UID что-то, что имеет смысл, замените /testкаталог, который вы хотите ~~ для имитации.

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

В качестве примечания: я ни в коем случае не говорю, что это хорошая идея, но она обеспечит желаемую функциональность.

РЕДАКТИРОВАТЬ: Для полноты картины это было предложено 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.

Естественно, вы можете заменить каталоги символическими ссылками на каталоги столько раз, сколько захотите.

PSkocik
источник
1

Расширение ~тильды оболочки в основном программируемое. Он расширяется либо до пользовательского каталога системного имени пользователя, объявленного в его завершающем контексте (и превосходное решение в этом направлении уже было предложено) , либо до значения $HOMEпеременной оболочки, либо не изменяется вовсе.

Так:

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

/tmp
/home/mikeserv

Я постоянно изменяю $HOMEи сохраняю функцию в файле окружения моей оболочки для ее сброса:

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

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


Еще одно предложение, которое у меня есть, - это лишь небольшое дополнение к прекрасному совету @ PSkocik по использованию $CDPATH. Однако он не упомянул одну вещь: вы можете использовать и изменять $CDPATHinline без изменения текущего значения оболочки $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
mikeserv
источник
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, и т.д ...
Дероберт
1
Вопрос неясен. Если это желаемое использование, я бы использовал CDPATHпеременную для обработки cdслучая.
Гленн Джекман
Согласитесь, это не совсем понятно, но ОП просит, чтобы это работало как ~. И ~не используется как команда.
Дероберт
Я нашел это довольно понятным сам, если не полностью изложенный. Проблема в CDPATHтом, что он не работает для команд за пределами ... CD. То есть вы могли cd ~~или cd ~~/testdir1не моглиvim ~~testdir1
Соус
вы могли бы сделать лучше с псевдонимом, который вызывает функцию. какalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv