spanish example ejemplos ejemplo backtick bash shell unix scripting

bash - ejemplos - expect ssh example



Shell script no se está ejecutando, comando no encontrado (12)

Soy muy, muy nuevo en la programación de UNIX (que se ejecuta en MacOSX Mountain Lion a través de Terminal). He estado aprendiendo lo básico de un curso de bioinformática y métodos moleculares (hemos tenido dos clases) en el que eventualmente usaremos perl y python para fines de administración de datos. De todos modos, se nos ha asignado la tarea de escribir un script de shell para tomar datos de un grupo de archivos y escribirlos en un nuevo archivo en un formato que pueda ser leído por un programa específico (Migrate-N).

He obtenido una serie de funciones para hacer exactamente lo que necesito de forma independiente cuando las escribo en la línea de comandos, pero cuando las puse todas juntas en un script e intento ejecutarlo obtengo un error. Aquí están los detalles (pido disculpas por la longitud):

#! /bin/bash grep -f Samples.NFCup.txt locus1.fasta > locus1.NFCup.txt grep -f Samples.NFCup.txt locus2.fasta > locus2.NFCup.txt grep -f Samples.NFCup.txt locus3.fasta > locus3.NFCup.txt grep -f Samples.NFCup.txt locus4.fasta > locus4.NFCup.txt grep -f Samples.NFCup.txt locus5.fasta > locus5.NFCup.txt grep -f Samples.Salmon.txt locus1.fasta > locus1.Salmon.txt grep -f Samples.Salmon.txt locus2.fasta > locus2.Salmon.txt grep -f Samples.Salmon.txt locus3.fasta > locus3.Salmon.txt grep -f Samples.Salmon.txt locus4.fasta > locus4.Salmon.txt grep -f Samples.Salmon.txt locus5.fasta > locus5.Salmon.txt grep -f Samples.Cascades.txt locus1.fasta > locus1.Cascades.txt grep -f Samples.Cascades.txt locus2.fasta > locus2.Cascades.txt grep -f Samples.Cascades.txt locus3.fasta > locus3.Cascades.txt grep -f Samples.Cascades.txt locus4.fasta > locus4.Cascades.txt grep -f Samples.Cascades.txt locus5.fasta > locus5.Cascades.txt echo 3 5 Salex_melanopsis > Smelanopsis.mig echo 656 708 847 1159 779 >> Smelanopsis.mig echo 154 124 120 74 126 NFCup >> Smelanopsis.mig cat locus1.NFCup.txt locus2.NFCup.txt locus3.NFCup.txt locus4.NFCup.txt locus5.NFCup.txt >> Smelanopsis.mig echo 32 30 30 18 38 Salmon River >> Smelanopsis.mig cat locus1.Salmon.txt locus2.Salmon.txt locus3.Salmon.txt locus4.Salmon.txt locus5.Salmon.txt >> Smelanopsis.mig echo 56 52 24 29 48 Cascades >> Smelanopsis.mig cat locus1.Cascades.txt locus2.Cascades.txt locus3.Cascades.txt locus4.Cascades.txt locus5.Cascades.txt >> Smelanopsis.mig

La serie de greps acaba de extraer datos de secuencia de ADN para cada sitio para cada locus en nuevos archivos de texto. Los archivos de muestra ... txt tienen los números de ID de muestra para un sitio, los archivos .fasta tienen la información de secuencia organizada por ID de muestra; el grepping funciona bien en la línea de comandos si lo ejecuto individualmente.

El segundo grupo de código crea el nuevo archivo real que necesito para terminar, que termina en .mig. Las líneas de eco son datos sobre conteos (pares de bases por locus, poblaciones en el análisis, muestras por sitio, etc.) sobre las cuales el programa necesita información. Las líneas de cat son para unir el locus por los datos del sitio creados por todos los grepping debajo de la información específica del sitio dictada en la línea de eco. Usted sin duda obtener la imagen.

Para crear el script de shell que he estado iniciando en Excel, puedo copiar y pegar fácilmente / autocompletar celdas, guardar como texto delimitado por tabuladores y luego abrir ese archivo de texto en TextWrangler para eliminar las pestañas antes de guardar como archivo .sh (Línea saltos: Unix (LF) y Codificación: Unicode (UTF-8) en el mismo directorio que todos los archivos utilizados en el script. He intentado usar chmod +x FILENAME.sh y chmod u+x FILENAME.sh para tratar de asegurar que sea ejecutable, pero sin éxito. Incluso si reduzco el script a una sola línea grep (con la primera línea #! / Bin / bash) no puedo hacer que funcione. El proceso solo toma un momento cuando lo escribo directamente en la línea de comandos, ya que ninguno de estos archivos es más grande que 160 KB y algunos son significativamente más pequeños. Esto es lo que escribo y lo que obtengo cuando intento ejecutar el archivo (HW es el directorio correcto)

localhost:HW Mirel$ MigrateNshell.sh -bash: MigrateNshell.sh: command not found

He estado en este impass durante dos días, ¡por lo que cualquier comentario sería muy apreciado! ¡¡Gracias!!


Agregue las siguientes líneas en su ruta de perfil.

PATH=$PATH:$HOME/bin:$Dir_where_script_exists export PATH

Ahora tu script debería funcionar sin ./

Raj Dagla


Asegúrese de que no esté utilizando "PATH" como variable, lo que anulará el PATH existente para las variables de entorno.


Cambie la primera línea a la siguiente como lo señala Marc B

#!/bin/bash

Luego marque el script como ejecutable y ejecútelo desde la línea de comando

chmod +x MigrateNshell.sh ./MigrateNshell.sh

o simplemente ejecute bash desde la línea de comando que pasa en su script como parámetro

/bin/bash MigrateNshell.sh


Ha habido algunos buenos comentarios sobre la adición de la línea shebang al principio de la secuencia de comandos. Me gustaría agregar una recomendación para usar el comando env también, para portabilidad adicional.

Si bien #!/bin/bash puede ser la ubicación correcta en su sistema, eso no es universal. Además, puede que no sea la fiesta preferida del usuario. #!/usr/bin/env bash seleccionará el primer bash encontrado en la ruta.


Por razones de seguridad, el shell no buscará en el directorio actual (de forma predeterminada) un ejecutable. Debe ser específico y decirle a bash que su script está en el directorio actual ( . ):

$ ./MigrateNshell.sh


Primero:

chmod 777 ./MigrateNshell.sh

Entonces:

./MigrateNshell.sh

O, agregue su programa a un directorio reconocido en su variable $ PATH. Ejemplo: Ejemplo de variable de ruta que le permitirá llamar a su programa sin ./


Prueba chmod u+x MigrateNshell.sh


También asegúrese de que / bin / bash sea la ubicación adecuada para bash ... si tomó esa línea de un ejemplo en algún lugar, es posible que no coincida con su servidor en particular. Si está especificando una ubicación no válida para bash, tendrá un problema.


También intente dos2unix el script de shell, porque a veces tiene finales de línea de Windows y el shell no lo reconoce.

$ dos2unix MigrateNshell.sh

Esto ayuda a veces.


También soy nuevo en shell scripting, pero tuve este mismo problema. Asegúrese de que al final de su script tenga una línea en blanco. De lo contrario no funcionará.


Unix tiene una variable llamada PATH que es una lista de directorios donde encontrar comandos.

$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/david/bin

Si escribo un comando foo en la línea de comandos, mi shell primero verá si hay un comando ejecutable /usr/local/bin/foo . Si lo hay, ejecutará /usr/local/bin/foo . Si no, verá si hay un comando ejecutable /usr/bin/foo y si no está allí, verá si /bin/foo existe, etc. hasta que llegue a /Users/david/bin/foo .

Si no puede encontrar un comando foo en ninguno de esos directorios, dígame comando no encontrado .

Hay varias maneras en que puedo manejar este problema:

  • Use el comando bash foo ya que foo es un script de shell.
  • Incluya el nombre del directorio cuando ejecute el comando como /Users/david/foo o $PWD/foo o simplemente ./foo .
  • Cambie su variable $PATH para agregar el directorio que contiene sus comandos al PATH.

Puede modificar $HOME/.bash_profile o $HOME/.profile si no existe .bash_profile . Hice eso para agregar en /usr/local/bin que coloqué primero en mi camino. De esta manera, puedo anular los comandos estándar que están en el sistema operativo. Por ejemplo, tengo Ant 1.9.1, pero el Mac vino con Ant 1.8.4. Puse mi comando ant en /usr/local/bin , así que mi versión de ant se ejecutará primero. También agregué $HOME/bin al final del PATH para mis propios comandos. Si tuviera un archivo como el que desea ejecutar, lo colocaré en $ HOME / bin para ejecutarlo.


#! /bin/bash ^---

Retirar el espacio indicado. El shebang debería ser

#!/bin/bash