Экран GNU является IMO лучшая благодарность до сих пор. Если экран GNU (или tmux) не доступен, выполните Вашего коллегу script -f
.
И затем можно наблюдать то, что она делает путем выполнения tail -fn +0 /path/to/typescript
.
@Jordanm уже дал Вам канонический ответ, который работает на любую строку. Если Вы имеете дело конкретно с путями, можно также использовать программы basename
и dirname
:
basename - strip directory and suffix from filenames
dirname - strip last component from file name
Например:
$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
Это - общая задача, с которой может справиться расширение параметра в любой оболочке POSIX.
path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
Другая общепринятая методика должна использовать программу базового имени.
file=$(basename "$path")
Единственный недостаток должен породить внешнюю программу. Это - основное преимущество, то, что это правильно обрабатывает пути с запаздыванием /
.
"$(basename "$path")"
является неправильным в маловероятном случае, что $path
концы с новой строкой. Это вызвано тем, что a) basename
добавляют дополнительная новая строка на конце и b) $(command)
полосы все запаздывающие новые строки. Заставить его работать требует извращенного обходного решения, чего-то вроде этого: path=$'/tmp/evil\n'; file="$(basename "$path"; printf x)"; strip=$'\nx'; fixed="${file%%$strip}"
– Matt
09.10.2013, 09:04
При выполнении этого с именами файлов используйте basename
команда:
$ basename $HOME/Documents/test/one.txt
one.txt
Далее:
$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt
Если необходимо разделить произвольные строки с произвольными разделителями, это - определенное волшебство. Считайте строку в массив и установите разделитель поля ввода на разделитель.
Вот пример:
$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt