Я хочу ~~указать на другой каталог, чтобы использовать его в качестве ярлыка. Я хочу, чтобы он имел точно такие же функциональные возможности, что и ~. Как я могу это сделать?
Я хочу ~~указать на другой каталог, чтобы использовать его в качестве ярлыка. Я хочу, чтобы он имел точно такие же функциональные возможности, что и ~. Как я могу это сделать?
Ответы:
На самом деле, есть способ, это не отличный способ, но это путь, ха-ха!
Добавьте следующее в ваш /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
useradd 'tmp'и затем заменить tmpна~
shadowзаписи, но я полагаю, что если пароль не установлен, это не является дополнительным риском.
Вы можете использовать CDPATH и поместить каталог с буквальным именем ~~ в один из ваших компонентов CDPATH.
От man bash(но CDPATH доступен даже в sh)
Путь поиска для команды cd. Это разделенный двоеточиями список каталогов, в котором оболочка ищет каталоги назначения, указанные командой cd. Примером значения является ".: ~: / Usr".
Это позволит вам сделать cd ~~.
Если вы хотите делать что-то вроде vi ~~/someFileгде-нибудь в дереве каталогов, то вам не повезло, если вы настаиваете ~~буквально, если только вы не взломали свою оболочку, однако вы можете использовать переменные или переменную окружения для хранения ваших магических каталогов, чтобы вы могли делать например,$tilda/someFile
Я обычно помещаю часто используемые файлы в каталоги с короткими именами в своем домашнем каталоге, чтобы иметь к ним доступ с помощью путей, таких как ~/bили ~/l.
Естественно, вы можете заменить каталоги символическими ссылками на каталоги столько раз, сколько захотите.
Расширение ~тильды оболочки в основном программируемое. Он расширяется либо до пользовательского каталога системного имени пользователя, объявленного в его завершающем контексте (и превосходное решение в этом направлении уже было предложено) , либо до значения $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
Прекрасно работает как функция bash:
$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman
Вот еще один подход, который немного ближе (я знаю, что не подхожу к требованиям)
function ~~ { echo /test; }
Затем с еще парой символов:
cd `~~`/subdir
vi `~~`/file
cd ~~/foo/barне будет работать так хорошо, или vim ~~/foo.txt, и т.д ...
CDPATHпеременную для обработки cdслучая.
~. И ~не используется как команда.
CDPATHтом, что он не работает для команд за пределами ... CD. То есть вы могли cd ~~или cd ~~/testdir1не моглиvim ~~testdir1
alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '