Я хочу ~~
указать на другой каталог, чтобы использовать его в качестве ярлыка. Я хочу, чтобы он имел точно такие же функциональные возможности, что и ~
. Как я могу это сделать?
Я хочу ~~
указать на другой каталог, чтобы использовать его в качестве ярлыка. Я хочу, чтобы он имел точно такие же функциональные возможности, что и ~
. Как я могу это сделать?
Ответы:
На самом деле, есть способ, это не отличный способ, но это путь, ха-ха!
Добавьте следующее в ваш /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
. Однако он не упомянул одну вещь: вы можете использовать и изменять $CDPATH
inline без изменения текущего значения оболочки $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 '