mac - env: python / r: No existe tal archivo o directorio
mac os python (4)
El script My Python beak
contiene el siguiente shebang:
#!/usr/bin/env python
Cuando ejecuto el script $ ./beak
, obtengo
env: python/r: No such file or directory
Anteriormente saqué este script de un repositorio. ¿Cuál podría ser la razón de ésto?
Abra el archivo en vim o vi, y administre el siguiente comando:
:set ff=unix
Guardar y Salir:
:wq
¡Hecho!
Explicación
ff
significa formato de archivo , y puede aceptar los valores de unix
( /n
), dos
( /r/n
) y mac
( /r
) (solo destinados a ser utilizados en macs preintel, en macs modernos usan unix
). .
Para leer más sobre el comando ff
:
:help ff
:wq
significa W rite y Q uit, un equivalente más rápido es Shift + zz (es decir, mantenga presionada Shift y luego presione z
dos veces).
Ambos comandos deben usarse en modo comando .
Uso en múltiples archivos
No es necesario abrir el archivo en vim. La modificación se puede hacer directamente desde la línea de comando:
vi +'':wq ++ff=unix'' file_with_dos_linebreaks.py
Para procesar múltiples archivos *.py
:
for file in *.py ; do
vi +'':w ++ff=unix'' +'':q'' ${file}
done
La respuesta de falsetru resolvió absolutamente mi problema. Escribí un pequeño ayudante que me permite normalizar los finales de línea de múltiples archivos. Como no estoy muy familiarizado con los elementos de finales de línea en múltiples plataformas, etc., la terminología utilizada en el programa podría no ser 100% correcta.
#!/usr/bin/env python
# Copyright (c) 2013 Niklas Rosenstein
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
import os
import sys
import glob
import argparse
def process_file(name, lend):
with open(name, ''rb'') as fl:
data = fl.read()
data = data.replace(''/r/n'', ''/n'').replace(''/r'', ''/n'')
data = data.replace(''/n'', lend)
with open(name, ''wb'') as fl:
fl.write(data)
def main():
parser = argparse.ArgumentParser(description=''Convert line-endings of one ''
''or more files.'')
parser.add_argument(''-r'', ''--recursive'', action=''store_true'',
help=''Process all files in a given directory recursively.'')
parser.add_argument(''-d'', ''--dest'', default=''unix'',
choices=(''unix'', ''windows''), help=''The destination line-ending ''
''type. Default is unix.'')
parser.add_argument(''-e'', ''--is-expr'', action=''store_true'',
help=''Arguments passed for the FILE parameter are treated as ''
''glob expressions.'')
parser.add_argument(''-x'', ''--dont-issue'', help=''Do not issue missing files.'',
action=''store_true'')
parser.add_argument(''files'', metavar=''FILE'', nargs=''*'',
help=''The files or directories to process.'')
args = parser.parse_args()
# Determine the new line-ending.
if args.dest == ''unix'':
lend = ''/n''
else:
lend = ''/r/n''
# Process the files/direcories.
if not args.is_expr:
for name in args.files:
if os.path.isfile(name):
process_file(name, lend)
elif os.path.isdir(name) and args.recursive:
for dirpath, dirnames, files in os.walk(name):
for fn in files:
fn = os.path.join(dirpath, fn)
process_file(fn, fn)
elif not args.dont_issue:
parser.error("File ''%s'' does not exist." % name)
else:
if not args.recursive:
for name in args.files:
for fn in glob.iglob(name):
process_file(fn, lend)
else:
for name in args.files:
for dirpath, dirnames, files in os.walk(''.''):
for fn in glob.iglob(os.path.join(dirpath, name)):
process_file(fn, lend)
if __name__ == "__main__":
main()
La secuencia de comandos contiene caracteres CR. El shell interpreta estos caracteres CR como argumentos.
Solución: elimine los caracteres CR de la secuencia de comandos utilizando la siguiente secuencia de comandos.
with open(''beak'', ''rb+'') as f:
content = f.read()
f.seek(0)
f.write(content.replace(b''/r'', b''''))
f.truncate()
Puede convertir la línea que termina en * compatible con nix con
dos2unix beak