Создайте еще один ярлык `~~`, как `~` (домашний каталог)
10
Я хочу ~~указать на другой каталог, чтобы использовать его в качестве ярлыка. Я хочу, чтобы он имел точно такие же функциональные возможности, что и ~. Как я могу это сделать?
@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.
Естественно, вы можете заменить каталоги символическими ссылками на каталоги столько раз, сколько захотите.
Расширение ~тильды оболочки в основном программируемое. Он расширяется либо до пользовательского каталога системного имени пользователя, объявленного в его завершающем контексте (и превосходное решение в этом направлении уже было предложено) , либо до значения $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/2done
Ну, 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 '
Ответы:
На самом деле, есть способ, это не отличный способ, но это путь, ха-ха!
Добавьте следующее в ваш
/etc/passwd
файл:замените в
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 ~~
.Если вы хотите делать что-то вроде
vi ~~/someFile
где-нибудь в дереве каталогов, то вам не повезло, если вы настаиваете~~
буквально, если только вы не взломали свою оболочку, однако вы можете использовать переменные или переменную окружения для хранения ваших магических каталогов, чтобы вы могли делать например,$tilda/someFile
Я обычно помещаю часто используемые файлы в каталоги с короткими именами в своем домашнем каталоге, чтобы иметь к ним доступ с помощью путей, таких как
~/b
или~/l
.Естественно, вы можете заменить каталоги символическими ссылками на каталоги столько раз, сколько захотите.
источник
Расширение
~
тильды оболочки в основном программируемое. Он расширяется либо до пользовательского каталога системного имени пользователя, объявленного в его завершающем контексте (и превосходное решение в этом направлении уже было предложено) , либо до значения$HOME
переменной оболочки, либо не изменяется вовсе.Так:
Я постоянно изменяю
$HOME
и сохраняю функцию в файле окружения моей оболочки для ее сброса:Если вы хотите использовать
~
тильду каким-либо образом, который не относится к вашему домашнему каталогу, сделайте это . Просто переназначить$HOME
. Не бойся этого.$HOME
это просто переменная оболочки, как и любая другая.Еще одно предложение, которое у меня есть, - это лишь небольшое дополнение к прекрасному совету @ PSkocik по использованию
$CDPATH
. Однако он не упомянул одну вещь: вы можете использовать и изменять$CDPATH
inline без изменения текущего значения оболочки$CDPATH
. Например:cd
это обязательно встроенная оболочка, но это не встроенная специальная оболочка POSIX , и поэтому объявление значения для$CDPATH
не влияет на ее текущее значение оболочки. Если вы используете его, как я делал выше$CDPATH
, значение будет изменено только для среды однойcd
команды и впоследствии восстановлено до прежнего значения. Я склонен находить вышеупомянутую технику наиболее полезной, когда она используется в сочетании с завершением истории. Я сделаю все вышеизложенное, перейду в каталог, выполню несколько команд, затем буду нажимать, пока не вернусь к своейcd
команде и не выделю один или два сегмента пути, чтобы переместиться в другое место.Теперь, если вы объедините эти два понятия, вы можете сделать так, чтобы ранее использованная команда означала что-то совершенно другое в следующий раз, когда вы ее используете.
источник
Прекрасно работает как функция bash:
Вот еще один подход, который немного ближе (я знаю, что не подхожу к требованиям)
Затем с еще парой символов:
источник
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 '