Могу ли я передать сценарию bash локальный файл в $1 и заставить его повторить абсолютный путь к файлу? [duplicate]

Довольно самоочевидно.

Первый аргумент должен быть:

  • Проверяет, существует ли файл
  • Выдает абсолютный путь к файлу

Например:

+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt

Спасибо

9
задан 14 March 2017 в 10:45

3 ответа

Если Ваш сценарий

#!/bin/bash
[[ -e "$1" ]] && readlink -f -- "$1"

И имеет, выполняют разрешение (chmod u+x scriptname) Можно войти

./scriptname file

Получить полный путь, если файл существует (хотя Serg является правильным, что тест избыточен, если мы используем readlink -e и George прав использовать realpath вместо readlink)

Примечания

  • [[ -e "$1" ]] тест, ли $1, первый аргумент сценарию, существует
  • && если это делает (если предыдущая команда была успешна), затем делают следующую команду
  • readlink -f -- "$1" распечатайте полный путь (в реальный файл, даже если $1 символьная ссылка),

OP запросил, чтобы специальные символы были распечатаны с Escape. Должен быть умный путь*, но я сделал это как это (хотя это не будет иметь дело с одинарными кавычками - но их нельзя оставить так или иначе),

[[ -e "$1" ]] && readlink -f -- "$1" | sed -r 's/\||\[|\]| |!|"|\$|%|\^|&|\*|\(|\)\{|\}|\#|@|\;|\?|<|>/\\&/g'

Если это - только пробелы, Вы волнуетесь по поводу, Вы могли бы сделать это

sed 's/ /\\ /g'

Это получило бы одинарные кавычки (не очень полезно) и пробелы

sed -r "s/'| /\\\&/g"

Но я не думаю, что можно поймать и одинарные кавычки и двойные кавычки...

* Вот умный путь, 100%-й кредит к steeldriver

[[ -e "$1" ]] && printf "%q\n" "$(readlink -f -- "$1")"
7
ответ дан 23 November 2019 в 04:48

Сценарий не необходим. Сингл readlink команда достаточен:

$ cd /etc/

$ readlink -e passwd
/etc/passwd

От man readlink:

   -e, --canonicalize-existing
          canonicalize by following every symlink in every component
          of the given name recursively, all components must exist
8
ответ дан 23 November 2019 в 04:48
#!/bin/bash

[[ -e "$1" ]] && echo realpath -e "$1"

Обновление для заботы о неалфавитно-цифровых символах:

#!/bin/bash

[[ -e "$1" ]] && echo "$1" | sed -r 's/[^a-zA-Z0-9\-]/\//g' | realpath -e "$1"

Готовят сценарий: chmod +x script_name, затем

использование это: ./script_name filename

информация:

  1. [[ -e "$1" ]]: проверьте, существует ли переданный файл .
7
ответ дан 23 November 2019 в 04:48

Другие вопросы по тегам:

Похожие вопросы: